mysql如何按时间顺序对记录进行分组

标签 mysql

假设我在 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;

想法是按useridgroupnostarttime 对数据进行排序(也许date 应该也包括在内,很难从问题中分辨出来。

然后给变量@grp赋值。当 key 相同时,此值不会更改。当键发生变化时,该值会增加。有一点小技巧,因为上一行的 endtime 需要与当前行的 starttime 进行比较。

最后,@grp 用于聚合。

关于mysql如何按时间顺序对记录进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32246685/

相关文章:

php - 交易错误后数据也被保存

php - 注册时密码错误,但通过 bcrypt 更改密码后可以使用

mysql - 如何找到 MySQL 守护程序错误日志的位置?

mysql - 如何创建查询以避免 'subquery returns more than 1 row'

mysql - 从表格中查找几个月的连续数据

sql - 根据最高值更改列

php - 在不使用枚举的情况下,从 MySQL 的一组预选数据中输入数据的最佳方法是什么?

mysql - 获得 1 小时的房间可用性增量 MySQL

Mysql邻接表模型,我的查询结果不是我想要的

java - 与远程 MySQL DB 的 JDBC 连接失败;