根据分组行的其他字段的值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 |

我尝试做的是根据entrance字段的不同值对eName进行分组,如果值之间的差异为 (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 分钟的间隙时递增来定义组。我在结果集中添加了更多列,以使其更易于理解。

DB Fiddlde上的演示

ID | name | enames | cnt_entrances | first_entrance | last_entrance -: |:---- |:------------ |------------: |:------------- |:------------  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

相关内容

  • 没有找到相关文章

最新更新