Группировать по интервалу времени с количеством - PullRequest
0 голосов
/ 11 декабря 2018

Я построил следующий запрос:

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;

Он выводит следующие данные:

CALL_RESULT    VAL
8              12/10/2018 10:11:49
8              12/10/2018 10:15:56
8              12/10/2018 09:24:02
8              12/10/2018 09:24:14
8              12/10/2018 10:11:25
8              12/10/2018 10:12:01
8              12/10/2018 10:14:24
11             12/10/2018 09:20:47
11             12/10/2018 09:18:12
11             12/10/2018 09:18:30
11             12/10/2018 09:18:45
11             12/10/2018 09:18:46
...            ....

Я пытаюсь теперь посчитать другой CALL_RESULT, но группировать по интервалу времени15 минут.Я перепробовал все, что мог придумать, но не смог.Есть ли мастер Oracle, который может мне помочь?

Эта идея будет:

CALL_RESULT    INTERVAL              COUNT
8              10:00                 3
11             10:00                 1
8              10:15                 3
11             10:30                 0
8              10:30                 3
...            ....

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Если в исходных данных есть «пробелы», и вам нужен каждый интервал для того, чтобы он присутствовал в результате (например, может понадобиться для построения графиков), тогда вам нужно сгенерировать набор интервалов, чтобы охватить требуемый период времени.Теперь, опять же, есть несколько методов для этого, но ниже приведен способ, который является общим для многих баз данных, включая 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
0 голосов
/ 11 декабря 2018

На основании результатов вашего первого запроса, вы захотите сделать что-то вроде

select callresult, count(0)
from table
group by datepart(minute, val) / 15

, группируя по целочисленному округлению по минуте даты, и вы получите группы по 15 минут для работы вданные выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...