【问题标题】:GROUP_CONCAT according to values of other fields of grouped rowsGROUP_CONCAT 根据分组行的其他字段的值
【发布时间】:2021-02-15 21:46:44
【问题描述】:

我有一个表格,列如下:

| 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 |

我尝试做的是根据 entrance 字段的不同值对 eName 进行分组,如果值之间的差异为 (2),则将它们分组到别处将其作为新行返回?

想要的输出如下:

| id | name  |
|----|-------|--------       |
| 1  | user1 | enter1, enter2|
| 2  | user2 | enter1        |
| 3  | user3 | enter3        |
| 1  | user1 | enter2        |

【问题讨论】:

标签: mysql sql datetime group-concat gaps-and-islands


【解决方案1】:

我将此理解为间隙和岛屿问题,其中岛屿由同一用户的相邻入口组成,最大间隙为 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 分钟的间隔时递增来定义组。我在结果集中添加了几列以使其更易于理解。

Demo on DB Fiddlde

编号 |姓名 |名称 | 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

【讨论】:

  • 感谢您的回答,但我的 SQL 版本不是 MySQL 8.0,所以这不起作用,有没有办法与旧版本获得相同的结果?
  • @AliAlaoi:在 MySQL
猜你喜欢
  • 1970-01-01
  • 2022-10-16
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多