我遇到了一个看似简单的查询,但无法让它在最后几个小时运行。
我有一个表files
,它保存文件名和一些值,例如此文件中的记录,创建日期(create_date
),处理日期(processing_date
)等等。在不同的时间内创建日期可能有多个文件,很可能它们不会在创建的同一天进行处理,实际上甚至可能需要三天或更长时间来处理它们。
所以我们假设我有这些行,例如:
create_date | processing_date
------------------------------
2012-09-10 11:10:55.0 | 2012-09-11 18:00:18.0
2012-09-10 15:20:18.0 | 2012-09-11 13:38:19.0
2012-09-10 19:30:48.0 | 2012-09-12 10:59:00.0
2012-09-11 08:19:11.0 | 2012-09-11 18:14:44.0
2012-09-11 22:31:42.0 | 2012-09-21 03:51:09.0
我希望在单个查询中是将分组列截断到create_date
天,另外还有11列用于processing_date
和{{之间的差异1}},所以结果应该大致如下:
create_date
依此类推,我希望你明白这一点:)
我已经尝试了这一点,到目前为止,它可以为create_date | diff0days | diff1days | diff2days | ... | diff10days
------------------------------------------------------------------------
2012-09-10 | 0 2 1 ... 0
2012-09-11 | 1 0 0 ... 1
获取单个聚合列,但差异为 - 例如 - 3:
create_date
我尝试组合单个查询并尝试了子查询,但这没有帮助,或者至少我对SQL的了解还不够。
我需要的是一个提示,以便我可以将各种差异包括在列中,如上所示。 我怎么可能实现这个目标?
答案 0 :(得分:2)
这基本上是一个转轴问题:
SELECT TRUNC(f.create_date, 'DD') as created
, sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
when 0 then 1 end) as diff0days
, sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
when 1 then 1 end) as diff1days
, sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
when 2 then 1 end) as diff2days
, ...
FROM files f
GROUP BY
TRUNC(f.create_date, 'DD')
答案 1 :(得分:1)
SELECT CreateDate,
sum(CASE WHEN DateDiff(day, CreateDate, ProcessDate) = 1 THEN 1 ELSE 0 END) AS Diff1,
sum(CASE WHEN DateDiff(day, CreateDate, ProcessDate) = 2 THEN 1 ELSE 0 END) AS Diff2,
...
FROM table
GROUP BY CreateDate
ORDER BY CreateDate