如何选择按一天中的小时分组的记录,包括没有记录的小时数

Cyn*_*ech 1 sql oracle group-by date oracle10g

我在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;
Run Code Online (Sandbox Code Playgroud)

(不要注意奇怪的开始和结束日期,它们是这样的,因为它们是格林尼治标准时间,我是GMT + 10 - 但这是一个单独的问题,除非它影响回答这个问题的能力)

这会产生一个结果集:

DURING_HOUR            COUNT(*)               
---------------------- ---------------------- 
00                     12                     
01                     30                     
02                     18                     
03                     20                     
04                     12                     
05                     24                     
06                     20                     
07                     4                      
23                     8                      

9 rows selected
Run Code Online (Sandbox Code Playgroud)

如何修改此查询以显示包含0个事件的当天小时数?

我搜索了Stack Overflow,发现了一些类似的问题,但不能回答我的具体问题.

非常感谢您的协助.

Mic*_*sov 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;
Run Code Online (Sandbox Code Playgroud)