簡體   English   中英

組內日期之間的SQL差異

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM