0

我有一个可以是任何东西的数量值。对于这个例子,我们假设它是 75。

我有一个查询,它返回一组行,显示分散在该地方(物理上)的不同垃圾箱中的项目数。该列表按排序顺序排列。

我想过滤行以仅显示满足所需数量所需的行。这些行是按排序顺序排列的,并且总是需要按排序顺序排列,即仅第 1 行或第 1 行和第 2 行,或 1、2、3 等,但绝不是第 1、3、5 行。

这是一个需要过滤以仅返回数量 = 75 的前 2 行的示例:

row  item count
1       20
2       60
3        7
4       20

如果仍然需要某种运行总数或数量,并且剩余的项目数量是可能的,那也很好,但这可能是一个太远的步骤。

4

2 回答 2

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
于 2013-07-01T21:15:03.333 回答
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

于 2013-07-01T21:16:57.760 回答