我在MySql表中有这些记录
id | record_date | record_user
1 | 4/20/2015 5:00:00 PM | Kenny
2 | 4/20/2015 5:08:00 PM | Kyle
3 | 4/20/2015 5:08:20 PM | Stan
4 | 4/20/2015 5:09:00 PM | Kyle
5 | 4/20/2015 6:40:00 PM | Cartman
6 | 4/20/2015 6:41:00 PM | Timmy
7 | 4/20/2015 6:45:00 PM | Timmy
8 | 4/20/2015 6:45:20 PM | Timmy
9 | 4/20/2015 6:45:30 PM | Stan
我想通过record_user和2分钟的时间窗口订购这些记录。例如:Kyle在5:08和5:09之间有两条记录,必须粘在一起。
record_date | ids | record_user
4/20/2015 5:08:00 PM | 2,4 | kyle
在其他情况下,Stan有2条记录但是在不同的时间窗口
record_date | ids | record_user
4/20/2015 5:08:20 PM | 3 | stan
4/20/2015 6:40:00 PM | 9 | stan
对于此示例中的所有表,结果必须为
record_date | ids | record_user
4/20/2015 5:00:00 PM | 1 | kenny
4/20/2015 5:08:00 PM | 2,4 | kyle
4/20/2015 5:08:20 PM | 3 | stan
4/20/2015 6:40:00 PM | 5 | cartman
4/20/2015 6:40:00 PM |6,7,8 | timmy
4/20/2015 6:40:00 PM | 9 | stan
我可以在id中连接id并获取record_user和record_date,但我不知道日期是怎么回事。 In this question @pala_(谢谢你,你摇滚)。他解释了如何很好地处理mysql中的时间并帮助我理解时间窗口的麻烦但是mysql现在让我很头疼。
答案 0 :(得分:0)
警告我认为您的预期结果是错误的(即,显示某些组的错误日期,显示不应组合在一起的分组ID,例如显示两个值为timmy,其中只有两个落在两分钟窗口内),以及你想要第一次从组而不是最后一次显示的警告,以下查询将执行此操作:
select min(record_date) record_date, group_concat(id order by id asc) ids, record_user
from (
select if(((record_date < @last_record + interval 2 minute) and (@last_user = record_user)) or @last_record = '0000-00-00 00:00:00',
if((@last_record := record_date) and (@last_user := record_user), @group, @group),
if((@last_record := record_date) and (@last_user := record_user), @group := @group + 1, @group := @group + 1)) subgroup, records.*
from records, (select @last_record := '0000-00-00 00:00:00', @last_user := '', @group := 1) q
order by record_user, record_date asc
) q
group by subgroup
order by min(record_date) asc;
由于mysql没有任何窗口功能,因此有必要使用变量创建每组排名,并且为了强制mysql以特定顺序评估我们的变量,我们必须将它们包装在一堆条件语句中。这使查询变得丑陋,但它起作用。