2013-02-14 70 views
0

在[MYTABLE]选择行:SQL:其中一列的总和满足条件

[id] AS INT -- UNIQUE 
[price] AS MONEY 

在其上由[ID]订购了一套,我需要选择那些[ID] s其中总和的[价格]满足一些条件

例如:

[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.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 

的问题是使用运行总计解决,但主要问题是,我想避免计算运行总计为所有该组第一,然后找到标准符合的点,原因是该表包含超过100.000.000行,并且与[价格]总和相比的给定数量通常非常小(例如:1250.14),而预期的结果几乎没有丰富的100-150行!

是否有任何其他方式来计算并获得所需的行而不会干扰这些100.000.000行?

+0

它应该是'12.7'而不是'11.7'吧? – 2013-02-14 07:34:29

+0

是的你是对的 - 速度杀死:( – armen 2013-02-14 07:44:34

+0

为什么-1?我问了什么问题?请解释一下。我正在努力做所有事情。 – armen 2013-02-14 08:47:10

回答

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 
+0

谢谢!我完全忘了CTE和递归! – armen 2013-02-14 08:44:19

+0

不用客气@armen :) – TechDo 2013-02-14 08:48:18

+0

这是一个非常好的答案!如果可以的话,我会给它10张选票。 – 2013-02-14 15:50:53

0

似乎没有办法解决这个问题没有总结价格。您要么在插入时存储运行总数(使用更多的存储空间并稍微放缓插入),要么使用子查询或视图(非常非常慢)来强制计算每个查询的运行总数。

如果您最终使用运行总计字段,请确保为插入使用事务,这样数据不会处于杂乱状态。如果两个新记录几乎同时插入,则可能会发生这种情况。

+0

运行总列不可能使用,因为每次计算可能从不同的“高度”开始(基于[myDate]列),现在我使用“非常非常非常慢”的方式,它是真的很慢现在我试图用一种循环方法来实现另一种方法,并且我认为它会比现在使用的方法快得多非常快。 – armen 2013-02-14 07:54:22

+1

我真的很喜欢使用递归的答案......它是 非常聪明。只需从SQL服务器中获取一些数据,并且如果与服务器的连接速度很快,则在客户端分析数据可能会更好。 – 2013-02-14 15:52:52

1

你不会相信这一点,但所涉及行#长(例如,一个大的运行总阈值),是迄今为止最有效的方法解决这是一个CURSOR!是的,真的! Check it out here。顺便说一句,递归CTE方法可以运行到递归级别限制(如堆栈溢出)。

+0

你是对的!但是我会坚持使用递归方法,因为这个计算所涉及的行数接近30-40! – armen 2013-02-18 17:36:56