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)
但它不起作用。我将不胜感激任何形式的帮助。谢谢你。
另一种适用于 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
不会在热膨胀系数的递归部分不允许的。
归档时间: |
|
查看次数: |
318 次 |
最近记录: |