MySQL 按时间戳差异分组

MySQL group by timestamp difference

我需要编写 mysql 查询,它将根据时间戳之间的差异对结果进行分组。 可能吗? 我有 table 和位置,每一行都有 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)

这取决于你真正想要什么。如果你想将属于同一分钟的记录组合在一起,而不考虑与之前记录的差异,那么简单聚合就足够了:

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 分钟的连续记录组,这是一个间隔和孤岛问题。这是使用 window 函数(在 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