2010-08-11 45 views
1

我在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 - 但这是一个独立的问题,除非它影响到回答这个问题)

这将产生设定的结果的能力:

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

9 rows selected 

我怎样才能ammend这个查询显示包含0事件当天的时间?

我搜索了Stack Overflow,发现了一些类似的问题,但没有回答我的具体问题。

您的帮助表示赞赏。

回答

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; 
3

一个选择是创建一个单独的表24行:00 - > 23

然后外连接反对。

相关问题