Как выбрать записи, сгруппированные по часам дня, включая часы, не имеющие записей

У меня есть таблица в базе данных 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 и нашел некоторые подобные вопросы, но не тот ответ на мою конкретную проблему.

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

 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; 

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

Затем внешнее соединение против него.