Получите скользящее количество отметок времени в SQL - PullRequest
1 голос
/ 06 мая 2020

У меня есть таблица (в Oracle DB), которая выглядит примерно так, как показано ниже, с примерно 4000 записями. Это всего лишь пример того, как оформлен стол. Временные метки варьируются в течение нескольких лет.

|        Time                    |    Action      |
|   9/25/2019 4:24:32 PM         |      Yes       |
|   9/25/2019 4:28:56 PM         |      No        |  
|   9/28/2019 7:48:16 PM         |      Yes       |
|         ....                   |     ....       |

Я хочу иметь возможность получать количество временных меток, которые происходят в скользящем 15-минутном интервале. Моя основная цель - определить максимальное количество временных меток, которые появляются для любого 15-минутного интервала. Я бы хотел, чтобы это было сделано, просмотрев каждую метку времени и получив количество меток времени, которые появляются в течение 15 минут после этой метки.

Моя цель - иметь что-то вроде

|      Interval                             |              Count          |
| 9/25/2019 4:24:00 PM - 9/25/2019 4:39:00  |               2             |
| 9/25/2019 4:25:00 PM - 9/25/2019 4:40:00  |               2             |
|            .....                          |             .....           |
| 9/25/2019 4:39:00 PM - 9/25/2019 4:54:00  |               0             |  

Я не уверен, как я смогу это сделать, если вообще. Будем очень признательны за любые идеи или советы.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Если вам нужен любой 15-минутный интервал в данных, вы можете использовать:

select t.*,
       count(*) over (order by timestamp
                      range between interval '15' minute preceding and current row
                     ) as cnt_15
from t;

Если вы хотите максимум, используйте rank() на этом:

select t.*
from (select t.*, rank() over (order by cnt_15 desc) as seqnum
      from (select t.*,
                   count(*) over (order by timestamp
                                  range between interval '15' minute preceding and current row
                                 ) as cnt_15
            from t
           ) t
     ) t
where seqnum = 1;

Это не дает точно тех результатов, которые вы указали в запросе. Но он отвечает на вопрос:

Я хочу иметь возможность получать количество временных меток, которые происходят в скользящем 15-минутном интервале. Моя основная цель - определить максимальное количество временных меток, которые появляются для любого 15-минутного интервала.

1 голос
/ 06 мая 2020

Вы можете перечислить минуты с помощью рекурсивного запроса, а затем вывести таблицу с left join:

with recursive cte (start_dt, max_dt) as (
    select trunc(min(time), 'mi'), max(time) from mytable
    union all
    select start_dt + interval '1' minute, max_dt from cte where start_dt < max_dt
)
select 
    c.start_dt,
    c.start_dt + interval '15' minute end_dt,
    count(t.time) cnt
from cte c
left join mytable t 
    on  t.time >= c.start_dt 
    and t.time <  c.start_dt + interval '15' minute
group by c.start_dt
...