在[mytable]上:
[id] AS INT -- UNIQUE
[price] AS MONEY
在[id]排序的集合上,我需要选择那些[id] s,其中[price]的总和满足某些条件
例如:
[id] [price]
1 2.0
2 4.7
3 3.2
4 2.8
5 6.2
6 1.5
7 4.2
8 3.3
对于给定数字'10 .0':
[id] [price] [r_total]
1 2.0 2.0
2 4.7 6.7
3 3.2 9.9
4 2.8 12.7 <-- here the criteria meets for 10.0
5 6.2 18.9
6 1.5 20.4
7 4.2 24.6
8 3.3 27.9
所需的结果是一组[id] s:
[id]
1
2
3
4
问题是使用Running Total解决的,但主要问题是我想避免首先计算所有集合的运行总计,然后找到标准符合的点,原因是表包含更多超过100.000.000行,与[price]总和相比给定的数量通常非常小(例如:1250.14),预期结果几乎不会增加100-150行!
有没有其他方法可以计算并获得所需的行而不会打扰那些100.000.000行?
答案 0 :(得分:3)
请尝试使用CTE:
;with CTE1 as
(
SELECT
ID, Price, Price as CUM_SUM
FROM YourTable
WHERE ID=1
UNION ALL
SELECT
c.ID, c.Price, c.Price+c1.CUM_SUM as CUM_SUM
FROM CTE1 c1 INNER JOIN
YourTable c on c.ID=c1.ID+1
WHERE 10 >c1.CUM_SUM
)
select * from CTE1
答案 1 :(得分:1)
你不会相信这一点,但随着所涉及的行数增加(例如,大的运行总阈值),BY FAR解决这个问题的最有效方法是使用 CURSOR !! 强>是的,真的! Check it out here。顺便说一句,递归CTE方法可能会遇到递归级别限制(如堆栈溢出)。