#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
интервалы с начала.