2013-11-04 182 views
1

我有一張包含數千行的表格,我想計算其中一個字段的第90百分位數,稱爲「圓形」。使用MySQL計算百分位數值

例如,選擇處於第90百分位的回合的值。

我在MySQL中看不到直接的方法。

有人可以提供一些關於如何開始這種計算的建議嗎?

謝謝!

回答

0

http://www.artfulsoftware.com/infotree/queries.php#68

SELECT 
    a.film_id , 
    ROUND(100.0 * (SELECT COUNT(*) FROM film AS b WHERE b.length <= a.length)/total.cnt, 1) 
    AS percentile 
FROM film a 
CROSS JOIN ( 
    SELECT COUNT(*) AS cnt 
    FROM film 
) AS total 
ORDER BY percentile DESC; 

這可以是非常大的表

+0

不回答這個問題 - 它檢索電影長度的自上而下的百分位排名。相反,我要求計算一個單一的值,這個值是第90個百分點的「圓」字段值。 –

+0

使用'在百分位數在89和91之間' – exussum

+0

當我運行這個時,我得到一個未知列b.length。你有鏈接到這個演示的源表數據? –

2

先慢,讓我們假設你有一個表的值列。你想得到第95百分位值的行。換句話說,您正在尋找一個大於所有值的95%的值。
下面是一個簡單的答案:

SELECT * FROM 
(SELECT t.*, @row_num :[email protected]_num + 1 AS row_num FROM YOUR_TABLE t, 
    (SELECT @row_num:=0) counter ORDER BY YOUR_VALUE_COLUMN) 
temp WHERE temp.row_num = ROUND (.95* @row_num); 
0

我試圖解決這個相當長的一段時間,然後我發現了以下的答案。老實說,輝煌。即使對於大桌子也是相當快的(我用它的桌子包含大約5密耳的記錄,需要幾秒鐘)。

SELECT 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(field_name ORDER BY 
    field_name SEPARATOR ','), ',', 95/100 * COUNT(*) + 1), ',', -1) AS DECIMAL) 
    AS 95th Per 
FROM table_name; 

正如你可以想象的只是用你的表和列的名稱替換table_name和field_name。

欲瞭解更多信息,請查看Roland Bouman的原帖