0

我目前正在研究 Sybase ASE rdms,并且我有下表 (JOB_AUDIT) 填充了示例数据集:

IDJOB M_DATE 开始时间 时间结束
1 一个 12-25-2012 00:00:00 40100 40110
2 一个 12-25-2012 00:00:00 40111 40118
3 12-25-2012 00:00:00 40118 40129
4 一个 12-27-2012 00:00:00 40100 40112
5 一个 12-27-2012 00:00:00 40113 40118
6 C 12-27-2012 00:00:00 40120 40134

……

我想做的是首先计算每个批次每天运行的总执行时间,然后我想计算每个 bach 每天执行的百分比。

所以我创建了这个查询:

SELECT
  T1.M_DATE as Batch_DATE,
  T1.BATCH as Batch,
  count(T1.IDJOB) as Nb_jobs,
  sum(T1.END_TIME-T1.START_TIME) as Exec_Duration,
  sum(T1.END_TIME-T1.START_TIME)/T2.total as pct
FROM
  JOB_AUDIT T1
inner join 
  (select M_DATE,sum(END_TIME-START_TIME) as total from AUDIT_REP group by M_DATE) T2
ON
   T1.M_DATE = T2.M_DATE
GROUP BY  T1.M_DATE,T1.M_BATCH;

T2 表应该给我这样的输出:

M_DATE 全部的
12-25-2012 00:00:00 28
12-27-2012 00:00:00 31

那么决赛桌应该是这样的:

Batch_DATE NB_jobs Exec_Duration 百分比
12-25-2012 00:00:00 一个 2 17 0.607
12-25-2012 00:00:00 1 11 0.393
12-27-2012 00:00:00 一个 2 17 0.548
12-27-2012 00:00:00 C 1 14 0.452

但似乎连接不起作用,因为我有以下结果:

Batch_DATE NB_jobs Exec_Duration 百分比
12-25-2012 00:00:00 一个 2 17 0.607 (17/28)
12-25-2012 00:00:00 一个 2 17 0.548 (17/31) 不正确
12-25-2012 00:00:00 1 11 0.393 (11/28)
12-25-2012 00:00:00 1 11 0.355 (11/31) 不正确
12-27-2012 00:00:00 一个 2 17 0.607 (17/28) 不正确
12-27-2012 00:00:00 一个 2 17 0.548 (17/31)
12-27-2012 00:00:00 C 1 14 0.500 (14/28) 不正确
12-27-2012 00:00:00 C 1 14 0.452 (14/31)

所以,我想知道为什么我不能使用日期作为键,我确信我的 T2 表中的每个日期总会有一个唯一的记录,因为我按日期分组。

我认为问题在于记录是一个日期时间,我什至用 convert(date,M_DATE) 替换了所有 M_DATE 字段,但它什么也没改变。

注意:我正在使用 SYBASE ASE,因此无法使用窗口函数,因为此 RDMS 不支持它

4

1 回答 1

1

问题来了——

sum(t1.endtime-t1.start_time)/t2.total 

-- 我知道你想让聚合的结果除以 t2.total -- 但是这里的语法会先将 t1 中的每个匹配行求和,然后再除以 t2.total。所以如果你把它写到——

sum(convert(float,(t1.endtime-t1.start_time))/t2.total)

-- 然后它会给你你想要的结果 -- 这是我的测试 --

1> select * from JOB_AUDIT
2> go
 id          batch m_date                          start_time  endtime
 ----------- ----- ------------------------------- ----------- -----------
           1 A                 Dec 25 2012 12:00AM       40100       40110
           2 A                 Dec 25 2012 12:00AM       40111       40118
           3 B                 Dec 25 2012 12:00AM       40118       40129
           4 A                 Dec 27 2012 12:00AM       40100       40112
           5 A                 Dec 27 2012 12:00AM       40113       40118
           6 C                 Dec 27 2012 12:00AM       40120       40134

(6 rows affected)
1> select * from T2
2> go
 m_date                          total
 ------------------------------- -----------
             Dec 25 2012 12:00AM          28
             Dec 27 2012 12:00AM          31

(2 rows affected)
1> vi
[sh:vi /tmp/ctisql_SCNCSP]
1> select t1.m_date,t1.batch,count(id) nb_jobs,sum(t1.endtime-t1.start_time) as Exec_Duration,sum(convert(float,(t1.endtime-t1.start_time))/t2.total) pct
2> from JOB_AUDIT t1, T2 t2
3> where t1.m_date=t2.m_date
4> group by t1.m_date,t1.batch
5> order by 1,2
6> go
 m_date                          batch nb_jobs     Exec_Duration pct
 ------------------------------- ----- ----------- ------------- ---------------------------
             Dec 25 2012 12:00AM A               2            17                    0.607143
             Dec 25 2012 12:00AM B               1            11                    0.392857
             Dec 27 2012 12:00AM A               2            17                    0.548387
             Dec 27 2012 12:00AM C               1            14                    0.451613

(4 rows affected)

希望有帮助

于 2021-12-19T07:55:46.710 回答