Это тесно связано, но немного отличается от этого вопроса о Как получить самую последнюю запись за каждый день, когда в день несколько записей . ( Одна общая черта со многими, многими вопросами SQL - имя таблицы не было дано изначально! )
Основной метод будет заключаться в том, чтобы найти функцию, которая будет форматировать различные значения Registered_on так, чтобы все записи за определенный час были сгруппированы вместе. Предположительно это можно сделать с помощью TO_CHAR()
, поскольку мы имеем дело с Oracle (MySQL не поддерживает это).
SELECT TO_CHAR(Registered_on, "YYYY-MM-DD HH24") AS TimeSlot,
COUNT(*) AS Registrations
FROM EmployeeReg
GROUP BY 1
ORDER BY 1;
Возможно, вы сможете заменить записи '1' временным интервалом или выражением TO_CHAR()
; однако, по причинам обратной совместимости, вполне вероятно, что это будет работать как написано (но я не могу проверить, что для вас в Oracle - аналог работает нормально на IBM Informix Dynamic Server с использованием EXTEND(Registered_on, YEAR TO HOUR)
вместо TO_CHAR()
).
Если вы затем решите, что хотите, чтобы нули появлялись в течение нескольких часов, когда нет записей, вам нужно будет создать список всех часов, о которых вы хотите сообщить, и вам нужно будет выполнить ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ этого списка с результатом этого запроса. Сложная часть заключается в создании правильного списка - разные СУБД имеют разные способы сделать это.