根据 AMDP/MYSQL 中的连续日期汇总行的列值
Summing up column values of rows based on consecutive date in AMDP/MYSQL
我正在尝试将一个 SAP ABAP 代码转换为基于 MYSQL.
的新引入语言 SAP AMDP(ABAP 托管数据库过程)
我想对具有连续日期的行的列值求和,这意味着如果下一行的开始日期是当前行结束日期的第二天,那么该值应该求和。
例如:下面是我的来源table
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
第二行的开始日期(1 月 4 日)是第一行结束日期(1 月 3 日)的第二天,第三行也是如此。
所以结果应该是单行的,第一行的开始日期和第三行的结束日期以及所有三行的总和。预期结果应如下所示。
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 中,您可以使用 window 函数来解决这个问题:
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
我正在尝试将一个 SAP ABAP 代码转换为基于 MYSQL.
的新引入语言 SAP AMDP(ABAP 托管数据库过程)我想对具有连续日期的行的列值求和,这意味着如果下一行的开始日期是当前行结束日期的第二天,那么该值应该求和。
例如:下面是我的来源table
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
第二行的开始日期(1 月 4 日)是第一行结束日期(1 月 3 日)的第二天,第三行也是如此。
所以结果应该是单行的,第一行的开始日期和第三行的结束日期以及所有三行的总和。预期结果应如下所示。
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 中,您可以使用 window 函数来解决这个问题:
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