Как выбрать записи, сгруппированные по часу дня, включая часы без записей - PullRequest
1 голос
/ 11 августа 2010

У меня есть таблица в базе данных 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 событий?

Я искал переполнение стека и нашел несколько похожих вопросов, но не тот, который отвечает на мою конкретную проблему.

Ваша помощь приветствуется.

Ответы [ 2 ]

6 голосов
/ 11 августа 2010
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 голосов
/ 11 августа 2010

Один из вариантов - создать отдельную таблицу с 24 строками: 00 -> 23.

Затем выполнить внешнее соединение с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...