SQL — группировать по идентификатору и временному интервалу от переменной начальной точки

#sql #oracle #datetime #plsql #group-by

#sql #Oracle #дата-время #plsql #группировать по

Вопрос:

У меня есть таблица журнала событий, которая записывает в каждой строке идентификатор и DT_EVENT, т.Е.:

 ID     DT_EVENT
-------------------------
1      14-MAR-11 00:00:01
2      14-MAR-11 00:02:00
3      14-MAR-11 00:05:01
1      14-MAR-11 00:08:01
3      14-MAR-11 00:22:00
1      14-MAR-11 15:00:01
1      14-MAR-11 15:15:01
  

Мне нужно сгруппировать по идентификатору и временной интервал, скажем, 20 минут, начиная с первого события для ID. Что-то вроде:

 EV_GROUP    ID      DT_FIRST_EVENT      DT_LAST_EVENT          N_EVENTS
-----------------------------------------------------------------------
1           1       14-MAR-11 00:00:01  14-MAR-11 00:08:01        2
2           2       14-MAR-11 00:02:00  14-MAR-11 00:02:00        1
3           3       14-MAR-11 00:05:01  14-MAR-11 00:22:00        2
4           1       14-MAR-11 15:00:01  14-MAR-11 15:15:01        2
  

Я не уверен в том, как настроить предложение group для этого временного интервала. Есть идеи по этому поводу?

Ответ №1:

 SELECT  id, diff, MIN(dt_event), MAX(dt_event)
FROM    (
        SELECT  t.*,
                TRUNC((dt_event - FIRST_VALUE(dt_event) OVER (PARTITION BY id ORDER BY dt_event)) * 86400 / 1200) AS diff
        FROM    mytable t
        )
GROUP BY
        id, diff
  

Комментарии:

1. Кажется, это отлично работает! Но для чего именно выделяется ‘diff’? Я не уверен, почему это находится в предложении group by первого запроса…

2. @TheClue: diff это псевдоним для выражения во внутреннем запросе, который подсчитывает 20-minutes интервалы с начала.