我有一个表,其中列为波纹管:
| 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