Sql 子查询中的进一步分组周数
我试图从2列中减去值,并将它们分组到第周。 “事件代码”列的值为3,4。我试图将事件代码4的持续时间求和,并减去事件代码3的持续时间。需要在过去12周内得出这些值 这是我到目前为止所拥有的。我是材料,并按周数进一步分组:Sql 子查询中的进一步分组周数,sql,oracle,Sql,Oracle,我试图从2列中减去值,并将它们分组到第周。 “事件代码”列的值为3,4。我试图将事件代码4的持续时间求和,并减去事件代码3的持续时间。需要在过去12周内得出这些值 这是我到目前为止所拥有的。我是材料,并按周数进一步分组: SELECT DISTINCT CUSTOMER_ID, ((SELECT SUM(DURATION_IN_SECONDS)/60 FROM TABLE1 ee WHERE ee.CUSTOMER_ID = e.CUSTOMER_ID AND EVENT_CODE IN (4)
SELECT DISTINCT CUSTOMER_ID,
((SELECT SUM(DURATION_IN_SECONDS)/60 FROM TABLE1 ee WHERE ee.CUSTOMER_ID = e.CUSTOMER_ID AND EVENT_CODE IN (4))-
(SELECT SUM(DURATION_IN_SECONDS)/60 FROM TABLE1 ee WHERE ee.CUSTOMER_ID = e.CUSTOMER_ID AND EVENT_CODE IN (3))) AS UNPRODUCTIVE_MINUTES
FROM TABLE1 e
WHERE TIMEDATE >= TO_DATE('01-OCT-19','DD-MON-YY')
AND TIMEDATE <= TO_DATE('31-DEC-19','DD-MON-YY')
GROUP BY CUSTOMER_ID
但我的结果必须是这样的:
CUSTOMER_ID UNPRODUCTIVE_MINUTES
A100 1601
CUSTOMER_ID WEEKNUMBER UNPRODUCTIVE_MINUTES
A100 12 171
A100 11 108
A100 10 112
A100 9 110
A100 8 98
A100 7 67
A100 6 117
A100 5 100
A100 4 111
A100 3 77
A100 2 73
A100 1 87
我不确定您想如何计算周数,但我猜周数是
(timedate-start timedate/7)+1
,因此创建相应的查询
Select customer_id,
Sum(case when EVENT_CODE = 4 then DURATION_IN_SECONDS else (-1* DURATION_IN_SECONDS) end)/60 as dur,
Floor(Trunc(timedate) - TO_DATE('01-OCT-19','DD-MON-YY') / 7) + 1 as weeknumber
From table1 e
Where TIMEDATE >= TO_DATE('01-OCT-19','DD-MON-YY')
AND TIMEDATE <= TO_DATE('31-DEC-19','DD-MON-YY')
AND EVENT_CODE in (3, 4)
GROUP BY CUSTOMER_ID, floor(trunc(timedate) - TO_DATE('01-OCT-19','DD-MON-YY') / 7) + 1
选择客户id,
总和(当事件代码=4时,则持续时间(以秒计)或-1*持续时间(以秒计)结束)/60作为dur,
楼层(Trunc(timedate)-截止日期('19年10月1日','YY月日')/7)+1周编号
来自表1 e
其中TIMEDATE>=截止日期('19年10月1日','DD-MON-YY')
和时间日期
TO_CHAR(TIMEDATE,'ww')
函数可直接用于
确定周数
- 无需使用
相关子查询
,但条件聚合
应该改用
- 根据ISO标准将日期重新格式化为日期'yyyy-mm-dd'
,如下所示
谢谢你@Tejash。它必须是事件代码4的持续时间总和-事件代码3的持续时间总和。
SELECT CUSTOMER_ID,
TO_CHAR(TIMEDATE, 'ww') AS WEEK,
NVL(SUM(CASE
WHEN EVENT_CODE = 4 THEN
DURATION_IN_SECONDS / 60
END),
0) - NVL(SUM(CASE
WHEN EVENT_CODE = 3 THEN
DURATION_IN_SECONDS / 60
END),
0) AS UNPRODUCTIVE_MINUTES
FROM TABLE1 e
WHERE TIMEDATE BETWEEN DATE '2019-10-01' AND DATE '2019-12-31'
GROUP BY CUSTOMER_ID, TO_CHAR(TIMEDATE, 'ww')
ORDER BY CUSTOMER_ID, WEEK