假设我在 TableA 中有以下记录:
UserID, Date, GroupNo, StartTime, EndTime
4, 2015-08-03, 1, 2015-08-03 08:00:00, 2015-08-03 09:00:00
4, 2015-08-03, 1, 2015-08-03 09:00:00, 2015-08-03 10:00:00
4, 2015-08-03, 1, 2015-08-03 13:00:00, 2015-08-03 14:00:00
4, 2015-08-03, 1, 2015-08-03 14:00:00, 2015-08-03 15:00:00
4, 2015-08-03, 1, 2015-08-03 15:00:00, 2015-08-03 16:00:00
4, 2015-08-03, 2, 2015-08-03 17:00:00, 2015-08-03 18:00:00
有没有一种方法可以使用查询将我的记录分组为 3 行,从而将所有链接的时间(结束时间)=时间(开始时间)分组在一起?
查询的最终结果将是:
UserID, Date, GroupNo, StartTime, EndTime
4, 2015-08-03, 1, 08:00:00, 10:00:00
4, 2015-08-03, 1, 13:00:00, 16:00:00
4, 2015-08-03, 2, 17:00:00, 18:00:00
我认为查询应该是这样的:
select UserID, Date, GroupNo, min(time(StartTime)) as StartTime,
max(time(EndTime)) as EndTime
from TableA
group by "??"
但我不确定如何将其分组...
是否可行?
非常感谢。
如果数据尚未按顺序排列,或者涉及其他日期:我发现此修改后的查询有效:(对于将来可能需要知道的其他人)
select userid, min(date) 作为日期, groupno, min(time(starttime)), max(time(endtime))
从(选择一个。*,
(@grp := if(@ugt = concat_ws('-', userid, date, groupno, time(starttime)),
if(@ugt := concat_ws('-', userid, date, groupno, time(endtime)), @grp, @grp),
if(@ugt := concat_ws('-', userid, date, groupno, time(endtime)), @grp+1, @grp+1)
)
) 组
from (select * from TableA where userid=4 order by date, Time(starttime)) 交叉连接
(选择@grp := 0, @ugt := NULL) 参数
按用户 ID、日期、组号、时间(开始时间)排序
) a where userid=4
按 userid、groupno、grp 分组
按日期、时间(开始时间)排序
最佳答案
这在 MySQL 中有点麻烦,但是有可能。您需要跟踪时间以确定新组何时开始。变量可能是最简单的方法:
select userid, min(date) as date, groupno, min(starttime), max(endtime)
from (select a.*,
(@grp := if(@ugt = concat_ws('-', userid, groupno, starttime),
if(@ugt := concat_ws('-', userid, groupno, endtime), @grp, @grp),
if(@ugt := concat_ws('-', userid, groupno, endtime), @grp+1, @grp+1)
)
) grp
from tableA a cross join
(select @grp := 0, @ugt := NULL) params
order by userid, groupno, starttime
) a
group by userid, groupno, grp;
想法是按userid
、groupno
和starttime
对数据进行排序(也许date
应该也包括在内,很难从问题中分辨出来。
然后给变量@grp
赋值。当 key 相同时,此值不会更改。当键发生变化时,该值会增加。有一点小技巧,因为上一行的 endtime
需要与当前行的 starttime
进行比较。
最后,@grp
用于聚合。
关于mysql如何按时间顺序对记录进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32246685/