SQL Server-添加/累积最近3天



表1

金额

10
20
25
40
50
60
70
80
90
100
110
120
130

编写一个sql查询以获得的输出

07/11/2018  10  
07/12/2018  20  
07/13/2018  25  55
07/14/2018  40  85
07/15/2018  50  115
07/16/2018  60  150
07/17/2018  70  180
07/18/2018  80  210
07/19/2018  90  240
07/20/2018  100 270
07/21/2018  110 300
07/22/2018  120 330
07/23/2018  130 360

所以我想把最近3天的金额加起来,得到总和。

LAG窗口函数正是您所需要的。它允许您访问前一行的列中的值。格式为LAG([Column]、[Row Offset]、[Default](,因此本例将当前行的值添加到后面2行的值和后面1行的值。

DECLARE @t TABLE (dt DATE, c INT)
INSERT INTO @t VALUES 
('07/11/2018',10),
('07/12/2018',20),
('07/13/2018',25),
('07/14/2018',40),
('07/15/2018',50),
('07/16/2018',60),
('07/17/2018',70),
('07/18/2018',80),
('07/19/2018',90),
('07/20/2018',100),
('07/21/2018',110),
('07/22/2018',120),
('07/23/2018',130)
SELECT dt, c, 
c + LAG(c, 2) OVER (ORDER BY dt) + LAG(c, 1) OVER (ORDER BY dt)
FROM @t
ORDER BY dt

退货:

dt          c   
2018-07-11  10  NULL
2018-07-12  20  NULL
2018-07-13  25  55
2018-07-14  40  85
2018-07-15  50  115
2018-07-16  60  150
2018-07-17  70  180
2018-07-18  80  210
2018-07-19  90  240
2018-07-20  100 270
2018-07-21  110 300
2018-07-22  120 330
2018-07-23  130 360

我不会在这里给你一个完整的答案,因为你还没有回应我的评论。因此,我将给你一个部分答案,这样你就可以自己想出如何做到这一点。

使用SUM时,您还可以访问OVER子句。在2012+中(我假设您正在使用它,因为2008现在实际上已经不受支持了,以前的任何内容都完全不受支持(,您可以访问OVER中的ROWS BETWEEN子句。

例如:

WITH N AS (
SELECT *
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) V(N)),
Tally AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1
CROSS JOIN N N2)
SELECT I,
SUM(I) OVER (ORDER BY I
ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) AS SomeSum
FROM Tally
ORDER BY I;

此示例计算当前行的SUM,以及随后的3行。所以,对于I = 1,这就是SUM(1,2,3,4) = 10

这些都可以在文档中找到:SUM(Transact-SQL(。SELECT-OVER子句(Transact-SQL(

最新更新