【问题标题】:MySQL group by timestamp differenceMySQL按时间戳差异分组
【发布时间】:2020-08-28 02:00:09
【问题描述】:

我需要编写 mysql 查询,它将按时间戳之间的差异对结果进行分组。 可能吗? 我有位置表,每一行都有created_at(时间戳),我想按差异> 1分钟对结果进行分组。 示例:

id | lat | lng | created_at
1. | ... | ... | 2020-05-03 06:11:35
2. | ... | ... | 2020-05-03 06:11:37
3. | ... | ... | 2020-05-03 06:11:46
4. | ... | ... | 2020-05-03 06:12:48
5. | ... | ... | 2020-05-03 06:12:52

此数据的结果应为 2 组 (1,2,3) 和 (4,5)

【问题讨论】:

    标签: date group-by mariadb window-functions gaps-and-islands


    【解决方案1】:

    这取决于你真正想要什么。如果你想把属于同一分钟的记录组合在一起,不管和之前的记录有什么区别,那么简单的聚合就足够了:

    select 
        date_format(created_at, '%Y-%m-%d %H:%i:00') date_minute,
        min(id) min_id, 
        max(id) max_id, 
        min(created_at) min_created_at, 
        max(created_at) max_created_at,
        count(*) no_records
    from mytable
    group by date_minute
    

    另一方面,如果您想构建间隔小于 1 分钟的连续记录组,这就是间隙和孤岛问题。下面是使用窗口函数(在 MySQL 8.0 中可用)解决它的方法:

    select 
        min(id) min_id, 
        max(id) max_id, 
        min(created_at) min_created_at, 
        max(created_at) max_created_at,
        count(*) no_records
    from (
        select
            t.*,
            sum(case when created_at < lag_created_at + interval 1 minute then 0 else 1 end) 
                over(order by created_at) grp
        from (
            select
                t.*,
                lag(created_at) over(order by created_at) lag_created_at
            from mytable t
        ) t
    ) t
    group by grp
    

    【讨论】:

    • 我需要建立连续记录组。尝试编写代码,但会引发语法错误。我的mysql版本是:10.1.44-MariaDB-0ubuntu0.18.04.1
    • @general666 。 . .您应该更新您的 MariaDB 版本。如果没有窗口函数,这将非常具有挑战性。
    • @general666:从 Maria DB 10.3 开始可以使用窗口函数。正如 Gordon Linoff 所说,如果没有窗口函数,这个问题很难解决。
    • 在这种情况下,DATE_FORMAT(...) 的替代品是 LEFT(created_at, 16)。
    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2012-06-03
    • 1970-01-01
    • 2019-12-22
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多