[英]SQL difference between dates inside group by
我有這張桌子-
----------------------------------------------
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)
將有助於提高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.