2009-09-11 55 views
5

我有一個表,它有一個名爲Score的特定數字列。我想對該表執行查詢,其結果將有100行,每行表示與該百分點相對應的分數。例如,結果可能如下所示:上述SQL:查找百分點

Percentile | Score 
--------------------- 
01   | 10 
02   | 12 
03   | 12 
04   | 17 
...  | ... 
99   | 1684 
100  | 1685 

在結果表得分值是存在於原始表實際分數值,並且不進行內插。插值結果會更好,但不是必需的。

可能有幾種啓發式方法可以產生這樣的結果。我今天使用的(代碼)基本上如下 - 與百分位對應的分數值將是分數值,其中:分數較小的行數除以總行數,四捨五入爲整數,相當於百分(我希望這是明確的)

我可以考慮其他的啓發,如果它們是更容易實現

我在MS-SQL的工作,但希望一個解決方案,也適用於MySQL的。

達到此目的的最佳方法是什麼?

+0

我不知道,如果是最好的SQL本身內實現這一點。 – Amber

+0

@Dav:我也不確定。我試圖瞭解在SQL中是否可行,以及性能影響。有數千萬記錄我不記憶 - 也許SQL是最好的方法。 –

+0

@Dav:另一點 - 如果你認爲它不適合SQL,並且你可以使用具體的參數來支持它,那麼這是一個有效的**答案**是我的觀點。 –

回答

5

SQL Server

SELECT percentile, score 
FROM (
     SELECT ROW_NUMBER() OVER (PARTITION BY percentile ORDER BY score) AS rn, percentile, score 
     FROM (
       SELECT score, NTILE(100) OVER (ORDER BY score) AS percentile 
       FROM mytable 
       ) q 
     ) q2 
WHERE rn = 1 
+0

這可以在SQL2000服務器上以任何類似的方式使用嗎?礦僅8.0.2055,因此不認可ROW_NUMBER()或NTILE()的初學者。 – Cylindric

+0

也適用於PostgreSQL。謝謝。 – bortzmeyer