SQL отличается между двумя датами внутри группы по - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть эта таблица -

----------------------------------------------
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

edit - я задал вопрос о разнице с моей правкой.На оригинальный вопрос здесь уже дан ответ.

1 Ответ

0 голосов
/ 25 февраля 2019

Это ответ на первоначальную версию вопроса:

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».

...