与下一行的差值的累积和

问题描述 投票:0回答:1

这是数据集:(所需输出在图像中以粗体突出显示)尝试在 Snowflake SQL 上执行此操作,图像中的 F 列解释了如何导出 E 列

我想获取第5列,第5列是每个地区和类型的总和,减去与每个月相关的金额。

对于美国地区和类型 Apple, 第 5 列的第 1 行显示 160,意味着(美国、苹果的总计为 170),因此我们从中减去 10(第 1 个月的金额),得到 160 第 5 列第 2 行显示 140,与该行关联的金额为 20(第 2 个月的金额),因此我们减去它得到 140 ......

欧洲地区和橙色类型类似,总数为 135, 对于第 5 列第 13 行,我们从 135 中减去 10 得到 125 对于第 5 列第 14 行,我们从 125 中减去 5 得到 120。

select 
  *, (sum - l_amt) as amount, (sum - amt) as amount2
from (
select 
   region, type, month, amount,
   sum(amount) over (partition by region, type) as sum,
   lag(amount) over (partition by region, type, month order by month asc) as l_amt
from table)

代码中的 Amount 和 Amount2 都是错误的,不知道该怎么做?

sql mysql window-functions
1个回答
0
投票

您可以使用您的方法(按照 ValNik 的建议进行更正):

select 
    region, type, month, amount,
    sum(amount) over (partition by region, type) -
    sum(amount) over (partition by region, type order by month asc) as amt
from tbl
order by region desc, type asc, month asc;

或者您可以使用按

month desc
排序的累积总和,偏移量为 1 行:

select *,
    ifnull(sum(amount) over (
        partition by region, type
        order by month desc
        rows between unbounded preceding and 1 preceding
    ), 0) as amount
from tbl
order by region desc, type asc, month asc;

两者都会返回您想要的输出,但第二个查询效率更高一些,因为它只使用一个临时表,而不是查询所需的两个临时表。

这是一个db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.