【发布时间】:2020-07-13 03:45:48
【问题描述】:
我有一张这样的桌子
RID ID DTE FLAG AMT SUMAMT
1 1 2020-07-03 02:52:15.480 Y 10 NULL
2 1 2020-07-04 02:52:15.480 N 10 NULL
3 1 2020-07-05 02:52:15.480 N 10 NULL
4 1 2020-07-06 02:52:15.480 Y 10 NULL
5 1 2020-07-13 02:52:15.480 Y 10 NULL
6 2 2020-07-06 02:52:15.480 N 10 NULL
7 2 2020-07-13 02:52:15.480 Y 10 NULL
我需要这样的结果
RID ID DTE FLAG AMT SUMAMT
1 1 2020-07-03 02:52:15.480 Y 10 10
2 1 2020-07-04 02:52:15.480 N 10 NULL
3 1 2020-07-05 02:52:15.480 N 10 NULL
4 1 2020-07-06 02:52:15.480 Y 10 30
5 1 2020-07-13 02:52:15.480 Y 10 10
6 2 2020-07-06 02:52:15.480 N 10 NULL
7 2 2020-07-13 02:52:15.480 Y 10 20
我需要做的就是更新 'Y' FLAG 行项目的 SUMAMT 列。这里的条件是每当我们找到'Y' FLAG,我们需要检查过去是否有任何基于DTE的'N'标记的行项目,如果是我们需要对该行项目进行AMT并需要总结和更新SUMAMT。
SELECT RID,ID,DTE,FLAG,AMT,SUM(AMT) OVER (PARTITION BY ID ORDER BY ID,DTE) FROM #T
我尝试了上面的查询,它给出了运行总数,我不明白如何制作如下所述的分区......
RID ID DTE FLAG AMT SUMAMT
1 1 2020-07-03 02:52:15.480 Y 10 10
2 1 2020-07-04 02:52:15.480 N 10 NULL
3 1 2020-07-05 02:52:15.480 N 10 NULL
4 1 2020-07-06 02:52:15.480 Y 10 30
5 1 2020-07-13 02:52:15.480 Y 10 10
6 2 2020-07-06 02:52:15.480 N 10 NULL
7 2 2020-07-13 02:52:15.480 Y 10 20
查询创建表和插入数据...
CREATE TABLE #T
(
RID INT IDENTITY(1, 1),
ID INT,
DTE DATETIME,
FLAG VARCHAR(1),
AMT INT,
SUMAMT INT
)
INSERT INTO #T (ID, DTE, FLAG, AMT)
VALUES (1, GETDATE() - 10, 'Y', 10),
(1, GETDATE() - 9, 'N', 10),
(1, GETDATE() - 8, 'N', 10),
(1, GETDATE() - 7, 'Y', 10),
(1, GETDATE(), 'Y', 10),
(2, GETDATE() - 7, 'N', 10),
(2, GETDATE(), 'Y', 10)
【问题讨论】:
标签: sql sql-server window-functions azure-sql-server