使用NOT EXISTS 或LEFT JOIN 可以很好地找到数据中没有相反数量的数量。
但要真正找到与按 ID 排序的金额不平衡的金额?
对于这样的 SQL 谜题,它应该作为一个 Gaps-And-Islands 问题来处理。
所以解决方案可能看起来有点复杂,但实际上非常简单。
它首先计算每个绝对值的排名。
并根据该排名过滤每个排名的 SUM 未平衡的最后一个数量(不是 0)
SELECT Id, Reff, Amount
FROM
(
SELECT *,
SUM(Amount) OVER (PARTITION BY Rnk) AS SumAmountByRank,
ROW_NUMBER() OVER (PARTITION BY Rnk ORDER BY Id DESC) AS Rn
FROM
(
SELECT Id, Reff, Amount,
ROW_NUMBER() OVER (ORDER BY Id) - ROW_NUMBER() OVER (PARTITION BY ABS(Amount) ORDER BY Id) AS Rnk
FROM YourTable
) AS q1
) AS q2
WHERE SumAmountByRank != 0
AND Rn = 1
ORDER BY Id;
对 rextester 的测试here
如果顺序无关紧要,而只是平衡很重要?
然后可以简化查询。
SELECT Id, Reff, Amount
FROM
(
SELECT Id, Reff, Amount,
SUM(Amount) OVER (PARTITION BY ABS(Amount)) AS SumByAbsAmount,
ROW_NUMBER() OVER (PARTITION BY ABS(Amount) ORDER BY Id DESC) AS Rn
FROM YourTable
) AS q
WHERE SumByAbsAmount != 0
AND Rn = 1
ORDER BY Id;