SQL отличается между двумя датами внутри группы по
У меня есть этот стол -
----------------------------------------------
ID | user | eventID | type | timestamp
----------------------------------------------
1 | 1 | 1 | 3 | 2019-02-08 15:30:00
2 | 1 | 1 | 3 | 2019-02-08 15:31:00
3 | 1 | 1 | 9 | 2019-02-08 15:31:30
4 | 2 | 1 | 3 | 2019-02-08 15:32:00
5 | 2 | 1 | 3 | 2019-02-08 15:32:45
6 | 3 | 1 | 3 | 2019-02-08 15:33:00
7 | 3 | 1 | 9 | 2019-02-08 15:34:00
8 | 3 | 2 | 3 | 2019-02-08 15:35:00
9 | 3 | 2 | 9 | 2019-02-08 15:36:00
Я пытаюсь найти разницу во времени между типом 3 и типом 9 для каждого события, для каждого пользователя.
Например, вывод для этой таблицы будет -
----------------------------------------------
ID | user | eventID | timeDifference in sec
----------------------------------------------
1 | 1 | 1 | 30
2 | 3 | 1 | 60
3 | 3 | 2 | 60
Как видите, у каждого пользователя может быть несколько событий, и разные пользователи также могут иметь одно и то же событие. Некоторые пользователи и события имеют оба типа, а некоторые нет. Может быть несколько событий типа 3 и типа 9, но я хочу, чтобы разница между ними была ближе всего друг к другу. И тип 9 всегда происходит после типа 3. У меня также есть отдельный столбец с другим идентификатором для событий типа 9, если это полезно. Поэтому я пытаюсь найти разницу во времени между этими двумя типами для каждого события, для каждого пользователя.
Как мне это сделать?
Изменить - я забыл упомянуть, что может быть несколько пар событий типа 3 и 9 для каждого события, для каждого пользователя. Так что я хочу, чтобы различие всех этих пар, которые находятся рядом друг с другом, а не только одно различие на группу по.
Для этой таблицы -
----------------------------------------------
ID | user | eventID | type | timestamp
----------------------------------------------
1 | 1 | 1 | 3 | 2019-02-08 15:30:00
2 | 1 | 1 | 3 | 2019-02-08 15:31:00
3 | 1 | 1 | 9 | 2019-02-08 15:31:30
4 | 2 | 1 | 3 | 2019-02-08 15:32:00
5 | 2 | 1 | 3 | 2019-02-08 15:32:45
6 | 3 | 1 | 3 | 2019-02-08 15:33:00
7 | 3 | 1 | 9 | 2019-02-08 15:34:00
8 | 3 | 2 | 3 | 2019-02-08 15:35:00
9 | 3 | 2 | 9 | 2019-02-08 15:36:00
10 | 3 | 2 | 3 | 2019-02-08 15:37:00
11 | 3 | 2 | 9 | 2019-02-08 15:37:40
Выход будет -
----------------------------------------------
ID | user | eventID | timeDifference in sec
----------------------------------------------
1 | 1 | 1 | 30
2 | 3 | 1 | 60
3 | 3 | 2 | 60
4 | 3 | 2 | 40
редактировать - я задал вопрос о разнице с моим редактированием. На оригинальный вопрос здесь уже был дан ответ.
1 ответ
Это отвечает на оригинальную версию вопроса:
select user, eventid,
(to_seconds(min(case when type = 9 then timestamp end)),
to_seconds(max(case when type = 3 then timestamp end))
) as diff_seconds
from t
group by user, eventid;
Это возвращает разницу между самой ранней отметкой времени "9" и самой последней отметкой времени "3".