如何在 36 秒内找到时间链并对其进行分组?
How do I find and group time chains in 36 seconds?
- 我有约会对象table。
- 我想查找和分组相差 36 秒的日期。
- 前一天和现在有36秒的差异吗
下一个日期?
- 如果是,它将是一个组,直到链结束。
- 如果 36 秒的链被打破,它会开始一个新的组。
- 如果36秒没有链,finisDate和dateRangeIDs
returns空
我可以用软件来做,但是很费时间。我需要重新 MySQL.
我的约会对象table(日期 > %d.%m.%Y %H:%i:%s);
ID | Date
----+-----------------------
246 | 11.08.2014 07:54:38
247 | 11.08.2014 07:55:11
248 | 11.08.2014 07:55:45
249 | 11.08.2014 07:56:20
250 | 11.08.2014 07:56:53
251 | 11.08.2014 07:57:26
252 | 11.08.2014 07:58:01
253 | 11.08.2014 07:58:35
254 | 11.08.2014 07:59:10
255 | 11.08.2014 07:59:49
256 | 11.08.2014 07:59:58
257 | 11.08.2014 08:00:15
258 | 11.08.2014 08:00:23
259 | 11.08.2014 08:00:58
260 | 11.08.2014 08:01:01
261 | 11.08.2014 08:01:08
262 | 11.08.2014 09:12:11
预期结果:
mainID | startDate | finishDate | dateRangeIDs
--------+---------------------------+---------------------------+-----------------
246 | 11.08.2014 07:54:38 | 11.08.2014 07:59:10 | 247,248,249,250,251,252,253,254
255 | 11.08.2014 07:59:49 | 11.08.2014 08:01:08 | 256,257,258,259,260,261
262 | 11.08.2014 09:12:11 | NULL | NULL
最简单的方法是使用lag()
来获取前一个日期值。这在 MySQL 的大多数版本中都不可用。相关子查询真的很难工作。最后一个选项是变量:
select min(id) as mainid, min(date), max(date),
group_concat(id order by id) as ids
from (select t.*,
(@grp := if(@prev_date > date - interval 36 second,
if(@prev_date := date, @grp, @grp), -- keep the group the same
if(@prev_date := date, @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from t
order by date
) t cross join
(select @prev_date := '', @grp := 0) params
) t
group by grp;
编辑:
您可以通过以下方式删除主 ID:
select min(id) as mainid, min(date), max(date),
substr(group_concat(id order by id), length(min(id)) + 1) as ids
- 我有约会对象table。
- 我想查找和分组相差 36 秒的日期。
- 前一天和现在有36秒的差异吗 下一个日期?
- 如果是,它将是一个组,直到链结束。
- 如果 36 秒的链被打破,它会开始一个新的组。
- 如果36秒没有链,finisDate和dateRangeIDs returns空
我可以用软件来做,但是很费时间。我需要重新 MySQL.
我的约会对象table(日期 > %d.%m.%Y %H:%i:%s);
ID | Date
----+-----------------------
246 | 11.08.2014 07:54:38
247 | 11.08.2014 07:55:11
248 | 11.08.2014 07:55:45
249 | 11.08.2014 07:56:20
250 | 11.08.2014 07:56:53
251 | 11.08.2014 07:57:26
252 | 11.08.2014 07:58:01
253 | 11.08.2014 07:58:35
254 | 11.08.2014 07:59:10
255 | 11.08.2014 07:59:49
256 | 11.08.2014 07:59:58
257 | 11.08.2014 08:00:15
258 | 11.08.2014 08:00:23
259 | 11.08.2014 08:00:58
260 | 11.08.2014 08:01:01
261 | 11.08.2014 08:01:08
262 | 11.08.2014 09:12:11
预期结果:
mainID | startDate | finishDate | dateRangeIDs
--------+---------------------------+---------------------------+-----------------
246 | 11.08.2014 07:54:38 | 11.08.2014 07:59:10 | 247,248,249,250,251,252,253,254
255 | 11.08.2014 07:59:49 | 11.08.2014 08:01:08 | 256,257,258,259,260,261
262 | 11.08.2014 09:12:11 | NULL | NULL
最简单的方法是使用lag()
来获取前一个日期值。这在 MySQL 的大多数版本中都不可用。相关子查询真的很难工作。最后一个选项是变量:
select min(id) as mainid, min(date), max(date),
group_concat(id order by id) as ids
from (select t.*,
(@grp := if(@prev_date > date - interval 36 second,
if(@prev_date := date, @grp, @grp), -- keep the group the same
if(@prev_date := date, @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from t
order by date
) t cross join
(select @prev_date := '', @grp := 0) params
) t
group by grp;
编辑:
您可以通过以下方式删除主 ID:
select min(id) as mainid, min(date), max(date),
substr(group_concat(id order by id), length(min(id)) + 1) as ids