我需要在SQL中将上一时期的总和分组。这是我从简化客户(客户A,B和C)获得的数据
Customer Year Month Order
A 2019 5 10
A 2019 4 5
A 2019 3 3
A 2019 2 1
A 2018 12 3
B 2019 5 1
B 2019 4 2
B 2019 3 1
C 2019 5 2
C 2019 4 1
C 2019 2 1
C 2019 1 3
预期输出为上一期间的总订单
例如,第一行的预期输出为12,因为它在客户A中上一个期间(7 + 4 + 3 + 0)的总和。
另一个示例,第二行的预期输出为7,因为它在客户A中上一个期间(4 + 3 + 0)的总和。因此,下表是上表的预期输出
Customer Year Month Order Output
A 2019 5 10 12
A 2019 4 5 7
A 2019 3 3 4
A 2019 2 1 3
A 2018 12 3 0
B 2019 5 1 3
B 2019 4 2 1
B 2019 3 1 0
C 2019 5 2 5
C 2019 4 1 4
C 2019 2 1 3
C 2019 1 3 0
我需要在SQL中完成
答案 0 :(得分:1)
首先,我将更改列的名称(年,月和顺序为mysql保留字或函数)。您可以使用这样的子查询来做到这一点:
select customer,
`year`,
`month`,
`order`,
(select sum(output)
from yourtable b
where a.customer=b.customer and (a.year>b.year or (a.year=b.year and a.month>b.month)))
from yourtable a
您要做的是获取每一行,最后一列是具有相同客户并且年份低于客户年份的所有其他列的输出总和,或者如果年份相同,则月份更低
答案 1 :(得分:1)
在MySQL 8+中,您应该使用窗口函数:
filter_out_zeros
请注意,这只是更简洁,但它也应该具有更好的性能。
答案 2 :(得分:1)
这可以通过窗口功能来实现。以下链接提供了示例
LAG([,offset [,default_value]])OVER( 分区按expr,... ORDER BY expr [ASC | DESC],... )
http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/