Если в исходных данных есть «пробелы», и вам нужен каждый интервал для того, чтобы он присутствовал в результате (например, может понадобиться для построения графиков), тогда вам нужно сгенерировать набор интервалов, чтобы охватить требуемый период времени.Теперь, опять же, есть несколько методов для этого, но ниже приведен способ, который является общим для многих баз данных, включая Oracle 11g («рекурсивное общее табличное выражение»). Этот пример генерирует 96 15-минутных временных интервалов (достаточно для одного дня):
with cte (n) as (
select 0 as n from dual
union all
select n + 15 from cte
where n < (24*60)
)
select
dt + n/1440 as dt_from
, dt + (n+15)/1440 as dt_to
from cte
cross join (select to_date('2018-12-10','yyyy-mm-dd') as dt from dual)
Результат будет выглядеть следующим образом (dd.mm.yyyy):
+----+---------------------+---------------------+
| | DT_FROM | DT_TO |
+----+---------------------+---------------------+
| 1 | 10.12.2018 00:00:00 | 10.12.2018 00:15:00 |
| 2 | 10.12.2018 00:15:00 | 10.12.2018 00:30:00 |
...
| 95 | 10.12.2018 23:30:00 | 10.12.2018 23:45:00 |
| 96 | 10.12.2018 23:45:00 | 11.12.2018 00:00:00 |
+----+---------------------+---------------------+
Существуют и другие специфические способы Oracle для генерации заметных строк connect by level
, которые вы можете исследовать.
После того, как у вас есть необходимый набор интервалов, оставьте присоединенные к нему данные и сгруппируйте, например,
with cte (n) as (
select 0 as n from dual
union all
select n + 15 from cte
where n < (24*60)-15
)
select
d.CALL_RESULT, r.dt_from, count(d.val)
from (
select
cj.dt + n/1440 as dt_from
, cj.dt + (n+15)/1440 as dt_to
from cte
cross join (select to_date('2018-12-10','yyyy-mm-dd') as dt from dual) cj
) r
left join (
SELECT CALL_RESULT
, val
FROM (
SELECT CALL_RESULT
, TO_CHAR(FROM_TZ(CAST(DATE '1970-01-01' + (1 / 24 / 60 / 60) * CALL_TIME AS TIMESTAMP), 'UTC') AT TIME ZONE 'Pacific/Auckland', 'MM/DD/YYYY HH24:MI:SS') AS val
FROM WI_TABLE_1
)
WHERE val >= '12/10/2018'
GROUP BY CALL_RESULT
, val
) d on d.val >= r.dt_from and d.val < r.dt_to
group by
d.CALL_RESULT, r.dt_from