SQL 组内日期之间的差异
SQL difference between dates inside group by
我有这个 table -
----------------------------------------------
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 事件的不同 ID。我正在使用 MYSQL 5.7.23.
我该怎么做?
这将非常昂贵 -- 在 MySQL 8.0 中会更简单。但是你可以在每个类型 9 之前获取最近的类型 3,然后根据该信息进行聚合:
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)
上的索引将有助于提高性能。
我有这个 table -
----------------------------------------------
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 事件的不同 ID。我正在使用 MYSQL 5.7.23.
我该怎么做?
这将非常昂贵 -- 在 MySQL 8.0 中会更简单。但是你可以在每个类型 9 之前获取最近的类型 3,然后根据该信息进行聚合:
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)
上的索引将有助于提高性能。