У меня есть таблица базы данных с именем STATUS_HISTORY
СТАТУС - Может содержать три значения
UPDATED_BY_ID - идентификатор пользователя, который обновил запись
Теперь за целый день запись может переходить в разные статусы.
Я ищу запрос, чтобы дать ответ, как показано ниже:
╔═════════════════╤══════╤════════════╤═══════╗
║ Hour_of_the_day │ OPEN │ INPROGRESS │ CLOSE ║
╠═════════════════╪══════╪════════════╪═══════╣
║ 1 │ 10 │ 0 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 2 │ 10 │ 0 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 3 │ 10 │ 0 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 4 │ 9 │ 1 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 5 │ 9 │ 1 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 6 │ 8 │ 2 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 7 │ 8 │ 2 │ 0 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 8 │ 8 │ 1 │ 1 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 9 │ 8 │ 0 │ 2 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 10 │ 6 │ 2 │ 2 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 11 │ 6 │ 1 │ 3 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 12 │ 5 │ 2 │ 3 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 13 │ 4 │ 3 │ 3 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 14 │ 4 │ 3 │ 3 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 15 │ 2 │ 3 │ 5 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 16 │ 1 │ 2 │ 7 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 17 │ 0 │ 1 │ 9 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 18 │ 0 │ 0 │ 10 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 19 │ 0 │ 0 │ 10 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 20 │ 0 │ 0 │ 10 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 21 │ 0 │ 0 │ 10 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 22 │ 0 │ 0 │ 10 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 23 │ 0 │ 0 │ 10 ║
╟─────────────────┼──────┼────────────┼───────╢
║ 24 │ 0 │ 0 │ 10 ║
╚═════════════════╧══════╧════════════╧═══════╝
Примечание. Предположим, что задание помечено как ОТКРЫТОЕ, и в состоянии за последние 5 часов состояние не изменилось, его нужно считать за все 5 часов. То же самое относится и к другим состояниям, таким как close и inprogress, потому что не все записи будут меняться каждый час.
В основном на каждый час, сколько билетов было открыто, закрыто или в процессе.
Я не уверен, как написать запрос для этой логики. но ниже моя попытка, которая дает совершенно другой вывод.
SELECT TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24') AS hour,
COUNT(*) AS numPerHour, t.STATUS
FROM STATUS_HISTORY t
WHERE t.UPDATED_TIMESTAMP >= to_date('29-OCT-18','DD-MON-YY')
AND t.UPDATED_TIMESTAMP < to_date('30-OCT-18','DD-MON-YY')
GROUP BY TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24'), t.STATUS;
╔═════════════════╤════════════╤════════════╗
║ Hour_of_the_day │ NumPerHour │ INPROGRESS ║
╠═════════════════╪════════════╪════════════╣
║ 06 │ 2 │ OPEN ║
╟─────────────────┼────────────┼────────────╢
║ 09 │ 5 │ OPEN ║
╟─────────────────┼────────────┼────────────╢
║ 09 │ 2 │ OPEN ║
╟─────────────────┼────────────┼────────────╢
║ 09 │ 3 │ CLOSE ║
╟─────────────────┼────────────┼────────────╢
║ 07 │ 1 │ INPROGRESS ║
╟─────────────────┼────────────┼────────────╢
║ 08 │ 8 │ OPEN ║
╟─────────────────┼────────────┼────────────╢
║ 11 │ 1 │ CLOSE ║
╟─────────────────┼────────────┼────────────╢
║ 08 │ 1 │ INPROGRESS ║
╟─────────────────┼────────────┼────────────╢
║ 07 │ 3 │ OPEN ║
╟─────────────────┼────────────┼────────────╢
║ 11 │ 2 │ CLOSE ║
╟─────────────────┼────────────┼────────────╢
║ 12 │ 1 │ INPROGRESS ║
╚═════════════════╧════════════╧════════════╝
Я хотел бы понять, если есть другой способ справиться с этим с помощью Java-программы или запрос может предоставить эти результаты.
Используйте условную агрегацию.
select COUNT( CASE WHEN STATUS = 'OPEN' THEN 1 END ) as OPEN,
COUNT( CASE WHEN STATUS = 'INPROGRESS' THEN 1 END ) as INPROGRESS,
COUNT( CASE WHEN STATUS = 'CLOSE' THEN 1 END ) as CLOSE
....
....
GROUP BY TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24') --remove t.STATUS
STATUS_HISTORY
чтобы получить именно тот результат, который вы ожидаете. Моделирование dbfiddle будет более полезным.
Вы можете сделать это с помощью CASE:
SELECT TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24') AS hour,
COUNT(*) AS numPerHour, sum(case when t.STATUS='OPEN' then 1 ELSE 0 END) AS OPEN,
sum(case when t.STATUS='CLOSE' then 1 ELSE 0 END) AS CLOSE,
sum(case when t.STATUS='INPROGRESS' then 1 ELSE 0 END) AS INPROGRESS
FROM STATUS_HISTORY t
WHERE t.UPDATED_TIMESTAMP >= to_date('29-OCT-18','DD-MON-YY')
AND t.UPDATED_TIMESTAMP < to_date('30-OCT-18','DD-MON-YY')
GROUP BY TO_CHAR(t.UPDATED_TIMESTAMP , 'HH24'), t.STATUS