【问题标题】:How to query a cumulative sum up to a specific value in SQL如何在 SQL 中查询到特定值的累积总和
【发布时间】:2016-07-08 04:19:52
【问题描述】:

我有一个如下所示的 SQL 表:

Id  Quantity
1   24.857    
2   24.84
3   24.881
4   24.823

我需要选择数量的累积总和,直到达到指定值 - 比如说 50。 因此,对于上表,我需要查询返回前 3 行。 (前两行数量之和没有达到50,所以我也需要第三行。

现在我有下面的代码,它很接近但不太正确。此查询的结果仅返回表的前两行,这是不够的。

DECLARE @point INT = 50;

WITH x(Id, Quantity, RowNum, TotalQuantity) AS
(
  SELECT
    id, quantity, ROW_NUMBER() OVER (ORDER BY id),
    SUM(quantity) OVER (ORDER BY id RANGE UNBOUNDED PRECEDING)
  FROM inventory
)

SELECT x.Id, x.RowNum, x.Quantity, x.TotalQuantity
FROM x
WHERE x.TotalQuantity <= @point
ORDER BY x.Id

此查询结果如下:

Id  RowNum  Quantity   TotalQuantity
1   1       24.857     24.857
2   2       24.84      49.697

我觉得好像我需要一个 WHILE 循环在这里的某个地方,我尝试过但无济于事。

非常感谢任何帮助,谢谢。

【问题讨论】:

    标签: sql while-loop


    【解决方案1】:

    当总量 >= @point 时,您可以再使用一个 cte 来获取第一行。然后加入现有的 cte。

    WITH x(Id, Quantity, RowNum, TotalQuantity) AS
    (
      SELECT
        id, quantity, ROW_NUMBER() OVER (ORDER BY id),
        SUM(quantity) OVER (ORDER BY id RANGE UNBOUNDED PRECEDING)
      FROM inventory
    )
    , y as (select min(rownum) as minrownum from x where totalquantity >= @point)
    SELECT x.Id, x.RowNum, x.Quantity, x.TotalQuantity
    FROM x
    JOIN y on x.rownum <= y.minrownum
    ORDER BY x.Id
    

    【讨论】:

    • 可爱。谢谢。
    【解决方案2】:

    您可以使用 LAG 查看前一行。

    WITH x(Id, Quantity, RowNum, TotalQuantity, TotalQuantityPrior) AS
    (
      SELECT
        id, quantity, ROW_NUMBER() OVER (ORDER BY id),
        SUM(quantity) OVER (ORDER BY id RANGE UNBOUNDED PRECEDING) AS TotalQuantity,
        LAG(TotalQuantity,1,0) OVER (ORDER BY id) AS TotalQuantityPrior
      FROM inventory
    )
    
    SELECT x.Id, x.RowNum, x.Quantity, x.TotalQuantity
    FROM x
    WHERE x.TotalQuantityPrior <= @point
    ORDER BY x.Id
    

    我使用 0 作为默认值 - 如果您可以将 0 作为 @point 或其他值,则可能需要 -1,具体取决于您的业务规则。

    https://msdn.microsoft.com/en-us/library/hh231256.aspx

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 2023-03-16
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多