【问题标题】:SQL difference between dates inside group by分组内日期之间的SQL差异
【发布时间】:2019-07-19 05:38:29
【问题描述】:

我有这张桌子 -

----------------------------------------------
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 sql date group-by datediff


    【解决方案1】:

    这将非常昂贵——在 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) 上的索引将有助于提高性能。

    【讨论】:

    • 我不得不从 min(t9.timestamp) 中删除 min,这就像一个魅力。非常感谢!
    • 嘿@gordon,我对这个问题有一个小的扩展。如果我需要添加一个条件,即仅在类型 3 和类型 9 之间存在另一个类型 6 的事件时才计算差异怎么办?
    • @ajyvardan 。 . .这会增加额外的复杂性。您可以为timestamp_6 添加另一个子查询,然后在外部查询中比较timestamp_6timestamp_3
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多