SQL:选择列总和满足条件的行

时间:2013-02-14 07:27:49

标签: sql sql-server

在[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行?

2 个答案:

答案 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方法可能会遇到递归级别限制(如堆栈溢出)。