我有一个数量值可以是任何东西。对于这个例子,我们假设它是75。
我有一个查询,它返回一组行,显示散布在该地点(物理上)的不同分档中的项目数。该列表按排序顺序排列。
我想过滤行以仅显示满足所需数量所需的行。这些行按排序顺序排列,并且始终按排序顺序排列,即仅排第1行或第1行和第2行,或1,2,3等,但从不排第1,3,5行。
这是一个需要过滤的示例,只返回数量= 75的前两行:
row item count
1 20
2 60
3 7
4 20
如果仍然需要某种运行总量或数量并且剩余的物品数量也可能很大,但这可能是一个太过分的步骤。
答案 0 :(得分:0)
DECLARE @target int = 75;
DECLARE @t TABLE (rownum int, value int);
INSERT @t VALUES (1,60),(2,20),(3,7),(4,20);
WITH t_sum AS (
SELECT
rownum,
value,
SUM(value) OVER(ORDER BY rownum) AS r_total
FROM @t
)
SELECT
rownum,value
FROM t_sum
WHERE r_total - value < @target
答案 1 :(得分:0)
SQL Server 2012直接支持累积总和。在早期版本中,您需要以不同方式进行计算。我喜欢用相关的子查询来做这件事:
select row, itemcount,
(select sum(itemcount)
from t t2
where t2.row <= t.row
) as cumsum
from t
接下来,您需要第一行大于给定值。为此,使用子查询和一些算术:
select t.row, t.itemcount
from (select row, itemcount,
(select sum(itemcount)
from t t2
where t2.row <= t.row
) as cumsum
from t
) t
where 75 > cumsum - itemcount and 75 <= cumsum;
where
子句背后的逻辑相当简单。 cumsum
必须大于75
截止值。但是,可以有多行满足此条件。您希望cumsum
之前的值小于75
的需求 - 您可以通过减去当前itemcount
来获得。