mysql - GROUP_CONCAT 根据分组行的其他字段的值
问题描述
我有一个列如下表:
| id | name | entrance | eName |
|----|-------|----------|--------|
| 1 | user1 | 5:10 | enter1 |
| 2 | user2 | 2:15 | enter1 |
| 3 | user3 | 3:05 | enter3 |
| 1 | user1 | 5:12 | enter2 |
| 1 | user1 | 7:30 | enter2 |
我尝试做的是eName
根据entrance
字段的不同值进行分组,如果值之间的差异为(2),那么将它们分组到别处将其返回为新行?
所需的输出如下:
| id | name |
|----|-------|-------- |
| 1 | user1 | enter1, enter2|
| 2 | user2 | enter1 |
| 3 | user3 | enter3 |
| 1 | user1 | enter2 |
解决方案
我将其理解为间隙和岛屿问题,其中岛屿由同一用户的相邻入口组成,最大间隙为 2 分钟。
这是一种使用窗口函数的方法(在 MySQL 8.0 中可用):
select id, name, group_concat(ename order by entrance) enames,
count(*) cnt_entrances, min(entrance) first_entrance, max(entrance) last_entrance
from (
select t.*,
sum(entrance > lag_entrance + interval 2 minute) over(partition by id, name order by entrance) grp
from (
select t.*,
lag(entrance, 1, entrance) over(partition by id, name order by entrance) lag_entrance
from mytable t
) t
) t
group by id, name, grp
lag()
为您提供“上一次”进入的日期,然后我们使用sum()
每次满足超过 2 分钟的间隔时递增的累积值来定义组。我在结果集中添加了几列以使其更易于理解。
编号 | 姓名 | 名称 | cnt_entrances | 第一入口 | 最后一个入口 -: | :---- | :------------ | ------------: | :------------- | :------------ 1 | 用户1 | 输入1,输入2 | 2 | 05:10:00 | 05:12:00 1 | 用户1 | 输入2 | 1 | 07:30:00 | 07:30:00 2 | 用户2 | 输入1 | 1 | 02:15:00 | 02:15:00 3 | 用户3 | 输入3 | 1 | 03:05:00 | 03:05:00
推荐阅读
- algorithm - 在矩阵运行时复杂性中搜索单词
- xpath - 可以在二维层次结构中使用 Xpath 寻址节点吗?
- safari - 在右侧的 Safari 中打开新标签页
- r - 如何从同一点开始制作流畅的线条?
- vbscript - 使用 htmlfile COM 对象访问 WSH JScript 中对象的 .getOwnPropertyDescriptor() 方法
- python - 如何将列表中的项目传递到 xpath 以从网站下载文件?
- node.js - 使用 AWS SNS 删除或编辑未读推送通知?
- javascript - matter.js:有什么方法可以为我的精灵设置动画
- java - 读取值表格 excel 单行多列
- python - 如何将列表的行合并成短语(帮助完成代码)?