Получение почасовой статистики с использованием SQL - PullRequest
3 голосов
/ 22 декабря 2008

У нас есть таблица с именем 'employeeReg' с полями

employeeNo | employeeName | Registered_on

Здесь Registered_on - это отметка времени.

Нам требуется почасовая регистрация в течение нескольких дней. например.

01 января 08: 12–13: 1592 регистрации

01 января, 08: 01 - 02: 1020 регистраций

Может кто-нибудь предложить запрос для этого.


Мы используем Oracle 10gR2 в качестве сервера БД.

Ответы [ 2 ]

4 голосов
/ 22 декабря 2008

Это тесно связано, но немного отличается от этого вопроса о Как получить самую последнюю запись за каждый день, когда в день несколько записей . ( Одна общая черта со многими, многими вопросами 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()).

Если вы затем решите, что хотите, чтобы нули появлялись в течение нескольких часов, когда нет записей, вам нужно будет создать список всех часов, о которых вы хотите сообщить, и вам нужно будет выполнить ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ этого списка с результатом этого запроса. Сложная часть заключается в создании правильного списка - разные СУБД имеют разные способы сделать это.

2 голосов
/ 22 декабря 2008

Достигнуто то, что я хотел, с :)

SELECT TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24') AS TimeSlot,
       COUNT(*) AS Registrations
    FROM EmployeeReg a
    Group By TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24');
...