いくつかのオプションがあります。
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);
は第二1の可能性が高いパフォーマンスが向上します参加します。
あなたがそう
;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
のようなものは、おそらく、より効率的な方法があるでしょうするけれどもことができるようになりますSQL Server 2012ので
(できるだけ早く合計に達するとスキャンを停止する)
私は、これは行ごとに、カーソルのアプローチは、セットベースのアプローチよりも高速になりますいくつかのシナリオの一つであるという疑いを持っている... –
はどのバージョンのSQL Serverのですか? 2012年ではない場合は、リリースされる予定なので、移動する能力はありますか? –
は注文に使用されるIDですか? LAG機能を使用することができます。 – Randy