获取最大序列号 根据其相应金额的总和

Kir*_*ran 3 sql-server-2008 sql-server sql-server-2012

我有一个数据表如下:

s_no  amount
1      500
2      500
3      500
4      500
5      500
Run Code Online (Sandbox Code Playgroud)

我需要一个查询来根据 sum(amount) 找到 max(s_no) 例如,当 sum(amount)<=1600 时,我需要 4 作为结果。我可以通过使用游标获得所需的输出,但如果我可以使用查询会更容易。. 我尝试了如下查询:

SELECT MAX(s_no) from table HAVING SUM(amount)<=1600
Run Code Online (Sandbox Code Playgroud)

但它不起作用。我将不胜感激任何形式的帮助。谢谢你。

ype*_*eᵀᴹ 5

另一种适用于 2012 年之前版本的方法是使用递归 CTE。

reextester.com 上测试:

WITH ct AS
  ( SELECT TOP (1) s_no, amount, running_total = amount
    FROM tableX
    ORDER BY s_no

    UNION ALL

    SELECT n.s_no, n.amount, n.amount + n.previous_total
    FROM 
      ( SELECT t.s_no, t.amount, previous_total = ct.running_total,
               rn = ROW_NUMBER() OVER (ORDER BY t.s_no) 
        FROM ct
          JOIN tableX AS t
            ON t.s_no > ct.s_no
        WHERE ct.running_total < 1600 
      ) AS n
    WHERE n.rn = 1
  )
SELECT *
FROM ct 
WHERE running_total >= 1600 
OPTION (MAXRECURSION 0) ;          -- no limit on recursion
Run Code Online (Sandbox Code Playgroud)

CTE 的锚点(UNION ALL 的第一条腿)只选择第一行。然后在每次迭代中,CTE 的递归部分(第二条腿)选择下一行并计算运行总数,直到总和为 1600 或更多。

ROW_NUMBER()招和子查询是为了克服该限制TOP不会在热膨胀系数的递归部分不允许的。