首页 > 解决方案 > 在 SQL Server 中使用 over()

问题描述

我正在尝试over()在 SQL Server 中实现一个查询,该查询会生成一个按名称显示最近 3 个购买期间总和的列。

例如,在 period3 中,新列将显示按名称分组的 period1、period2、period3 的总和。在 period4 中,它应该显示 period2、period3 和 period4 的总和。在 period5 中,period3、period4 和 period5 的总和。如此等等

这个想法是专门使用over()T-SQL中的函数来实现解决方案。

桌子:

    Date1 Name1 Purchase_Amount Period1
    Date1 Name2 Purchase_Amount Period1
    Date2 Name1 Purchase_Amount Period2
    Date2 Name2 Purchase_Amount Period2
    Date2 Name3 Purchase_Amount Period2
    Date3 Name1 Purchase_Amount Period3
    Date3 Name2 Purchase_Amount Period3
    Date3 Name3 Purchase_Amount Period3
    Date3 Name4 Purchase_Amount Period3
    Date4 Name1 Purchase_Amount Period4
    Date4 Name2 Purchase_Amount Period4
    Date4 Name3 Purchase_Amount Period4
    Date4 Name4 Purchase_Amount Period4
    ...

标签: sqlsql-serversql-order-by

解决方案


这应该可以满足您的需要,假设一旦名称出现在表中,在每个后续期间都会有一行对应该名称。

SELECT *,
        SUM(Purchase_Amount) OVER (PARTITION BY Name 
                                       ORDER BY Date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM YourTable

如果不能保证在每个后续期间都有一行,则您需要在某事上进行外部联接以创建这样的行,否则,要汇总的名称的最后 3 行可能跨越超过 3 个期间的时间跨度。


推荐阅读