【问题标题】:How to select records grouped by the hour of the day including hours that have no records如何选择按一天中的时间分组的记录,包括没有记录的时间
【发布时间】:2011-03-28 05:04:37
【问题描述】:

我在 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 并且我是 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

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

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

感谢您的帮助。

【问题讨论】:

    标签: sql oracle date oracle10g group-by


    【解决方案1】:
    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;
    

    【讨论】:

      【解决方案2】:

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

      然后外连接反对它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        相关资源
        最近更新 更多