代码之家  ›  专栏  ›  技术社区  ›  Cyntech

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

  •  1
  • Cyntech  · 技术社区  · 16 年前

    我在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;
    

    这将生成以下结果集:

    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个事件的小时数?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Michael Pakhantsov    16 年前
    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
  •  3
  •   Tom H zenazn    16 年前

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

    推荐文章