有幾個選項。
1)三角加入
SELECT *
FROM YourTable Y1
WHERE (SELECT SUM(amount)
FROM YourTable Y2
WHERE Y1.id >= Y2.id) <= 370
2)遞歸CTE
WITH RecursiveCTE
AS (
SELECT TOP 1 id, amount, CAST(amount AS BIGINT) AS Total
FROM YourTable
ORDER BY id
UNION ALL
SELECT R.id, R.amount, R.Total
FROM (
SELECT T.*,
T.amount + Total AS Total,
rn = ROW_NUMBER() OVER (ORDER BY T.id)
FROM YourTable T
JOIN RecursiveCTE R
ON R.id < T.id
) R
WHERE R.rn = 1 AND Total <= 370
)
SELECT id, amount, Total
FROM RecursiveCTE
OPTION (MAXRECURSION 0);
的第二一個將可能有更好的表現。
在SQL Server 2012中,你將能夠所以像
;WITH CTE AS
(
SELECT id,
amount,
SUM(amount) OVER(ORDER BY id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS RunningTotal
FROM YourTable
)
SELECT *
FROM CTE
WHERE RunningTotal <=370
雖然有可能會成爲一個更有效的方式(儘快達到總停止掃描)
我有一個懷疑,這是爲數不多的場景,其中一個行由行,光標的方法會比一套基於方法快一個... – 2012-03-14 21:47:35
什麼版本你是否在SQL Server上?如果不是2012年,你是否有能力轉向它,因爲它即將被釋放? – 2012-03-14 21:50:28
是用於訂購的ID嗎?您可能可以使用LAG功能。 – Randy 2012-03-14 21:50:31