我的 SQL Server 数据库中有一个表,其中包含以下内容:
Date | Amount
------------|----------
2012-12-17 | 9.00
2012-12-18 | 8.00
2012-12-19 | 0.00
2012-12-20 | 1.50
2012-12-21 | 2.50
2012-12-22 | 0.00
2012-12-23 | 0.00
2012-12-24 | 0.00
2012-12-25 | 0.00
2012-12-26 | 4.00
2012-12-27 | 2.00
2012-12-28 | 7.00
我想要做的是每次选择取 3 行,并对 Amount
进行SUM
。如果SUM
的总和是0
,那么它应该删除这3条记录。否则,它应该不理会它们并获取接下来的 3 条记录并执行相同的检查。
因此,在这种情况下,只应从表中删除以下三个记录,因为它们是唯一 SUM
结果为 0
的记录。
2012-12-23 | 0.00
2012-12-24 | 0.00
2012-12-25 | 0.00
我怎样才能在 SQL Server 中完成他的任务?
最佳答案
您可以使用ROW_NUMBER
来创建3个元素组并计算总和。
WITH cte AS
(
SELECT *, rn = (ROW_NUMBER() OVER(ORDER BY [Date]) - 1) / 3
FROM #tab
), cte2 AS
(
SELECT *, [sum] = SUM(Amount) OVER (PARTITION BY rn ORDER BY [Date])
FROM cte
)
SELECT *
FROM cte2
WHERE [sum] = 0;
并使用删除
:
WITH cte AS
(
SELECT *, rn = (ROW_NUMBER() OVER(ORDER BY [Date]) - 1) / 3
FROM #tab
), cte2 AS
(
SELECT *, [sum] = SUM(Amount) OVER (PARTITION BY rn ORDER BY [Date])
FROM cte
)
DELETE t
FROM #tab t
JOIN cte2 c
ON t.[Date] = c.[Date]
WHERE [sum] = 0;
SELECT *
FROM #tab;
编辑:
如果您的数据可以包含负值,您可以使用:
WITH cte AS
(
SELECT *, rn = (ROW_NUMBER() OVER(ORDER BY [Date]) - 1) / 3
FROM #tab
), cte2 AS
(
SELECT rn, [sum] = SUM(Amount)
FROM cte
GROUP BY rn
)
SELECT c.*
FROM cte c
JOIN cte2 c2
ON c.rn = c2.rn
WHERE [sum] = 0;
关于sql - 每 N 选择行并进行 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33542316/