问题描述
我正在尝试将一种SAP ABAP代码转换为基于MYSQL的新引入的语言SAP AMDP(ABAP托管数据库过程)。
如果行的列值具有连续的日期,我想对它们的列值进行汇总,这意味着如果下一行的开始日期是当前行的结束日期的第二天,那么该值应该进行汇总。
例如:以下是我的源表
EMP Startdate Enddate amount
1 1/1/2020 1/3/2020 2
1 1/4/2020 1/7/2020 3
1 1/8/2020 1/10/2020 4
1 1/15/2020 1/18/2020 5
2 1/3/2020 1/6/2020 3
2 1/12/2020 1/15/2020 4
2 1/16/2020 1/20/2020 5
3 1/4/2020 1/8/2020 5
3 1/9/2020 1/11/2020 6
3 1/14/2020 1/18/2020 7
3 1/21/2020 1/24/2020 7
3 1/25/2020 1/27/2020 5
第二行的开始日期(4月1日)是第一行的结束日期(3月1日)的第二天,第三行的结束日期相同。
因此,结果应为单行,第一行的开始日期,第三行的结束日期以及所有三行的总计。预期结果应如下所示。
EMP Startdate Enddate amount
1 1/1/2020 1/10/2020 9
1 1/15/2020 1/18/2020 5
2 1/3/2020 1/6/2020 3
2 1/12/2020 1/20/2020 9
3 1/4/2020 1/11/2020 11
3 1/14/2020 1/18/2020 7
3 1/21/2020 1/27/2020 12
解决方法
这是一个间隙和孤岛的问题,您想在其中将“相邻”行分组在一起。我对AMDP不了解,但是在MySQL中,您可以使用窗口函数来实现这一点:
select emp,min(start_date) start_date,max(end_date) end_date,sum(amount) amount
from (
select t.*,sum(case when start_date = lag_end_date + interval 1 day then 0 else 1 end) over(partition by emp order by start_date) grp
from (
select t.*,lag(end_date) over(partition by emp order by start_date) lag_end_date
from mytable t
) t
) t
group by emp,grp