2013-02-14 51 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