Разница в 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
10  | 3      | 2         | 3      | 2019-02-08 15:37:00
11  | 3      | 2         | 9      | 2019-02-08 15:37:40

Я пытаюсь найти разницу во времени между типом 3 и типом 9 для каждой пары типов в каждом событии, для каждого пользователя.

Вывод будет -

----------------------------------------------
ID  | user   | eventID   | timeDifference in sec
----------------------------------------------
1   | 1      | 1         | 30
2   | 3      | 1         | 60
3   | 3      | 2         | 60
4   | 3      | 2         | 40

Как видите, у каждого пользователя может быть несколько событий, и разные пользователи также могут иметь одно и то же событие.Некоторые пользователи и события имеют оба типа, а некоторые нет.Может быть несколько событий типа 3 и типа 9, но я хочу разницу между всеми парами, которые находятся ближе всего друг к другу.(Для каждого события типа 9 разница между этим событием и событием типа 3, которое происходило до этого).Для каждого вхождения события типа 9 перед этим будет событие типа 3.У меня также есть отдельный столбец с другим идентификатором для событий типа 9, если это полезно.Я использую MYSQL 5.7.23.

Как мне это сделать?

1 Ответ

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

Это будет довольно дорого - было бы проще в MySQL 8.0.Но вы можете получить самый последний тип 3 перед каждым типом 9 и затем агрегировать на основе этой информации:

select user, eventid,
       ( to_seconds(min(t9.timestamp)) - to_seconds(timestamp_3) ) as diff_seconds
from (select t.*,
             (select max(t2.timestamp)
              from t t2
              where t2.user = t.user and t2.eventid = t.eventid and
                    t2.type = 3 and t2.timestamp < t.timestamp
             ) as timestamp_3
      from t
      where t.type = 9
     ) t9
group by user, eventid, timestamp_3;

Индекс на (user, eventid, type, timestamp) поможет повысить производительность.

...