表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(