2013-08-07 108 views
1

我已經創建了行列下表中的數據集位數:SQL查詢/查找基於排名

Position Index IndexL IndexH Amount Rank 
1   2.5 2  3  2000 1  
1   2.5 2  3  3000 2 
1   2.5 2  3  4000 3 
1   2.5 2  3  5000 4 
1   2.5 2  3  6000 5 

2   1.5 1  2  2500 1  
2   1.5 1  2  4500 2 
2   1.5 1  2  6700 3 
2   1.5 1  2  8900 4 
2   1.5 1  2  9900 5 

現在我想基於使用索引創建的行列找到百分這樣,我得到以下輸出:

Position Amount 
1   3000+(4000-3000)*(2.5-2) 
2   2500+(4500-2500)*(1.5-1) 

有人可以幫助我這個。我對SQL世界有點新鮮。

感謝, 莫妮卡

+0

我今天見過類似的問題 – jaczes

+0

您是否期待結果中每個不同的'Position'值都有一行? – ThinkJet

+0

是的。每個位置將有1行 – Monica

回答

0

我認爲你可以做你想做與percentile_cont()聚合功能是什麼。它看起來像你想要的位數:

SELECT position, 
     PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Amount) as Median 
from t 
group by position; 

你可以閱讀更多關於它here

+0

嗨,我還需要使用Percectile_cont現在我已經計算了排名。我認爲使用等級2和等級3並插入它們之間的值應該會給我正確的結果嗎? – Monica

+0

@Monica。 。 。如果你可以避開它,你最好使用'percentile_cont()'。無論如何,你必須進行一次聚合,每個「位置」只能得到一行。 (如果你想每行的中位數,你也可以使用'percentile_cont()'作爲分析函數。) –

0

可以讓Oracle使用NTILE解析函數分配百分你:

SELECT 
    position, 
    amount, 
    NTILE(100) OVER (PARTITION BY POSITION ORDER BY amount) 
FROM myTable 

我不知道結果會符合你的計算(我在我的一些統計數據的幾分朦朧)。如果沒有,請嘗試@GordonLinoff提出的PERCENTILE_CONT解決方案,否則您可以嘗試使用PERCENT_RANK分析功能 - 只需在上面的查詢中用PERCENT_RANK()替換NTILE(100)即可。

+0

嗨我已經使用第一個表中的row_number和paritition計算了排名。現在爲了得到最終的輸出結果,我只需要使用這個表中的數據並按照顯示的那樣進行計算 - 就像位置1一樣,將等級2和等級3的數值(IndexL和IndexH)和使用比率。 – Monica

+0

您可以使用'LEAD'函數獲得以下值:'LEAD(金額)OVER(按位排序)「。這將在分區中的最後一行返回null,所以如果你想將它默認爲'LEAD(Amount,1,your-default-value)'。恐怕我不明白你的期望輸出 - 你想看的所有東西*或者只是兩行樣本? –