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
我需要编写 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