我在Oracle数据库中有一个表,其中包含用户在我们的某个系统中执行的操作。它用于统计分析,我需要显示给定日期执行的操作数,按一天中的小时分组。
我有一个查询可以做到这一点,但是,它不显示一天中不包含任何操作的小时数(显然因为那小时没有要显示的记录)。
例如,查询:
SELECT TO_CHAR(event_date, 'HH24') AS during_hour,
COUNT(*)
FROM user_activity
WHERE event_date BETWEEN to_date('15-JUN-2010 14:00:00', 'DD-MON-YYYY HH24:MI:SS')
AND to_date('16-JUN-2010 13:59:59', 'DD-MON-YYYY HH24:MI:SS')
AND event = 'user.login'
GROUP BY TO_CHAR(event_date, 'HH24')
ORDER BY during_hour;
(不要注意奇怪的开始和结束日期,它们是这样的,因为它们是格林威治标准时间,我是GMT + 10 - 但这是一个单独的问题,除非它影响回答这个问题的能力)< / p>
这会产生一个结果集:
DURING_HOUR COUNT(*)
---------------------- ----------------------
00 12
01 30
02 18
03 20
04 12
05 24
06 20
07 4
23 8
9 rows selected
如何修改此查询以显示包含0个事件的当天的小时数?
我搜索过Stack Overflow,并发现了一些类似的问题,但不能回答我的具体问题。
感谢您的协助。
答案 0 :(得分:6)
SELECT h.hrs, NVL(Quantity, 0) Quantity
FROM (SELECT TRIM(to_char(LEVEL - 1, '00')) hrs
FROM dual
CONNECT BY LEVEL < 25) h
LEFT JOIN (SELECT TO_CHAR(event_date, 'HH24') AS during_hour,
COUNT(*) Quantity
FROM user_activity u
WHERE event_date BETWEEN
to_date('15-JUN-2010 14:00:00', 'DD-MON-YYYY HH24:MI:SS') AND
to_date('16-JUN-2010 13:59:59', 'DD-MON-YYYY HH24:MI:SS')
AND event = 'user.login'
GROUP BY TO_CHAR(event_date, 'HH24')) t
ON (h.hrs = t.during_hour)
ORDER BY h.hrs;
答案 1 :(得分:3)
一种选择是创建一个包含24行的单独表格:00 - &gt; 23。
然后对外加入。