2011-10-27 27 views
3

說我有,看起來數據表所示:SQL查詢 - 找到一行超過累積比例

ItemNo | ItemCount | Proportion 
------------------------------------------ 
1    3    0.15 
2    2    0.10 
3    3    0.15 
4    0    0.00 
5    2    0.10 
6    1    0.05 
7    5    0.25 
8    4    0.20 

換句話說,共有20個項目,每個ItemNo和的累積比例爲到100%。這裏表格行的排序很重要。

是否可以執行一個SQL查詢沒有循環或光標返回第一ItemNo超過累計比例是多少?

換句話說,如果「比例」我想檢查爲35%,這超過了是ItemNo 3第一行,因爲0.15 + 0.10 + 0.15 = 0.40

同樣,如果我想找到第一行超過75%,那將是ItemNo 7,因爲所有Proportion的總和直到該行小於0.75。

回答

5
select top 1 
    t1.ItemNo 
from 
    MyTable t1 
where 
    ((select sum(t2.Proportion) from MyTable t2 where t2.ItemNo <= t1.ItemNo) >= 0.35) 
order by 
    t1.ItemNo 
+0

到目前爲止在測試中工作 - 謝謝 – Widor

3

一種窗函數經典:

SELECT * 
FROM (
    SELECT ItemNo 
      ,ItemCount 
      ,sum(Proportion) OVER (ORDER BY ItemNo) AS running_sum 
    FROM tbl) y 
WHERE running_sum > 0.35 
LIMIT 1; 

作品在PostgreSQL的,等等。

或者,在 TSQL符號(你似乎使用):
SELECT TOP 1 *
FROM(
SELECT貨號
,ItemCount中
,SUM(比例)OVER(ORDER BY貨號)AS running_sum
FROM tbl)y
WHERE running_sum> 0.35;

在下面的註釋中,在tSQL中不起作用。

+0

在Sql Server中使用的語法有細微差別嗎?在使用第二個示例時,我會在'order'附近獲得錯誤的語法。' – Widor

+0

雖然我可能弄錯了,但我不認爲OVER子句可用於在SQL Server中生成運行總計,只有排名或對分區的總和。請參閱http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver/861073#861073這就是我選擇子查詢的原因。 – njr101

+0

@ njreed.myopenid.com:啊,看起來你是對的,不適用於tSQL。良好的聯繫。我刪掉了tSQL版本。請記住在你的巢問題中公開你的RDBMS。 :) –