提问者:小点点

在MySQL8中,如果下一行值与当前行值相同,如何得到持续时间和


我有一张桌子

id | Loc_id | time_in             | time_out            | duration | prev
1  | Loc A  | 2020-06-16 06:58:29 | 2020-06-16 07:05:45 | 7        | Null
2  | Loc B  | 2020-06-16 07:07:20 | 2020-06-16 07:16:43 | 9        | Loc A
3  | Loc B  | 2020-06-16 07:18:25 | 2020-06-16 07:23:28 | 5        | Loc B
4  | Loc C  | 2020-06-16 07:25:11 | 2020-06-16 07:28:16 | 3        | Loc B
5  | Loc D  | 2020-06-16 07:28:16 | 2020-06-16 07:33:01 | 4        | Loc C
6  | Loc D  | 2020-06-16 07:34:44 | 2020-06-16 07:39:05 | 4        | Loc D
7  | Loc B  | 2020-06-16 07:40:47 | 2020-06-16 07:44:16 | 3        | Loc D

如果下一行值与当前行值相同,我想要得到持续时间的和

id | Loc ID | duration
1  | Loc A  | 7
2  | Loc B  | 14
3  | Loc C  | 3
4  | Loc D  | 8
5  | Loc B  | 3

共1个答案

匿名用户

对于MySQL8.0+,可以使用sum()窗口函数创建所需的组,然后进行聚合:

select t.loc_id, sum(t.duration) duration
from (
  select *, sum(loc_id <> coalesce(prev, loc_id)) over (order by id) grp
  from tablename                        
) t
group by t.grp, t.loc_id

或者如果还需要id列:

select t.grp + 1 id, t.loc_id, sum(t.duration) duration
from (
  select *, sum(loc_id <> coalesce(prev, loc_id)) over (order by id) grp
  from tablename                        
) t
group by t.grp, t.loc_id

请参阅演示。
结果:

> id | loc_id | duration
> -: | :----- | -------:
>  1 | Loc A  |        7
>  2 | Loc B  |       14
>  3 | Loc C  |        3
>  4 | Loc D  |        8
>  5 | Loc B  |        3