每个分区先前行的累积和

Who*_*sKi 0 sql sql-server lag cumulative-sum

我想计算数据库中每个客户的每月订单累计金额。

例如,我有这样的数据:

顾客 无订单
第1544章 2022年 4 5
第1544章 2022年 4 1
第1544章 2022年 12 1
第1544章 2023年 1 3

结果应该与下面相同:

顾客 累计无订单数
第1544章 2022年 4 0
第1544章 2022年 12 6
第1544章 2023年 1 7

lag()在下一步中使用了 and ,sum() over ()但我的结果是错误的!

我怎么解决这个问题?

Mar*_*ith 5

正如@Larnu在评论中建议的那样

看来您需要在这里执行几个步骤。首先聚合(和分组)为几个月,然后使用累积 SUM,但让窗口不包含当前行。

下面是一些实现这个想法的 SQL ( DB FIDDLE )

SELECT customer,
       year,
       month,
       cumulative_no_orders = ISNULL(SUM(SUM(no_orders))
                                       OVER (
                                         PARTITION BY customer
                                         ORDER BY year, month 
                                         ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
                                     , 0)
FROM   YourTable
GROUP  BY customer,
          year,
          month 
Run Code Online (Sandbox Code Playgroud)

它首先进行聚合

SELECT customer,
       year,
       month,
       sum_no_orders = SUM(no_orders)
FROM   YourTable
GROUP  BY customer, year, month 
Run Code Online (Sandbox Code Playgroud)

返回以下内容

顾客 订单总数
第1544章 2022年 4 6
第1544章 2022年 12 1
第1544章 2023年 1 3

然后计算之前行的 sum_no_orders 的运行总计。

  • 事实并非如此。“GROUP BY customer,year,month”将为您提供一行 (3认同)
  • `2022` `4` 在您的示例数据 @WhoIsKi 中有 2 行,您可以在结果中看到仅返回 1 行,即 `2022` `4`。 (2认同)