2011-01-19 13 views
12

我想知道是否有任何函數可以在MySQL中用來從包含數值的列中選擇TOP X(或底部)百分比。在MySQL中爲數字值選擇TOP X(或底部)百分比

基本上,我有一個包含價格列表的列,我只想返回前十個百分點的價格領域。有什麼建議麼?

+0

如果只有MySQL支持的分析 - 專門針對這種情況的NTILE,但是ROW_NUMBER,DENSE_RANK,LEAD和LAG ...您的查詢必須計算派生表/內嵌視圖中的百分位數,以便按其過濾/排序。 – 2011-01-19 21:59:00

回答

5

UPDATE:從更多的知道人here更多深思熟慮的解釋。儘管如此,在MySQL中似乎還沒有嵌入式函數來計算百分位數。

嘗試:

SELECT * FROM價格WHERE價格> =(SELECT 0.9 * MAX(PRICE)FROM價格)

SELECT price FROM prices p1 WHERE 
(SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <= 
    (SELECT 0.1 * count(*) FROM prices) 
); 

這將給價格用於記錄其數量P1價格表有價格> = P1將在價格表中的記錄總數的十分之一。 之後:

SELECT * FROM prices WHERE price >= (SELECT price FROM prices p1 WHERE 
(SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <= 
    (SELECT 0.1 * count(*) FROM prices) 
); 

將返回所有需要的記錄。

注:我沒有檢查此查詢的性能,我認爲使用臨時表/變量的解決方案必須更有效。

+0

這不是什麼「第90百分點」意味着......您的查詢將選擇價格爲最高價格商品90%的行。 – Matthew 2011-01-19 22:04:34

+0

@Matthew你是對的。我試圖找出什麼是diffrence :) – 2011-01-19 22:12:13

+0

@維克多90%百分位數意味着「90%以上的值」 – Matthew 2011-01-19 22:30:41

5

編輯 - 新的答案

回答Convert SQL Server query to MySQL

Select * 
from 
(
    SELECT tbl.*, @counter := @counter +1 counter 
    FROM (select @counter:=0) initvar, tbl 
    ORDER BY ordcolumn 
) X 
where counter <= (50/100 * @counter); 
ORDER BY ordcolumn 


OLD ANSWER

對於MySQL,你可以計算出所需的批量大小,然後限制到該號碼的記錄

SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table; 
PREPARE STMT FROM ‘SELECT * FROM tbl ORDER BY price LIMIT ?’; 
EXECUTE STMT USING @rows; 

對於底部%的,只是爲了在反向

SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table; 
PREPARE STMT FROM ‘SELECT * FROM tbl ORDER BY price DESC LIMIT ?’; 
EXECUTE STMT USING @rows; 

哎呀,也許DESC所屬的第一個查詢,但你的意思。

對於SQL Server中,TOP N PERCENT條款有一定的幫助

select top 10 PERCENT * 
FROM TBL 
ORDER BY price 
5

只是作爲一個供參考(我知道這個問題是幾歲),這是可以做到其他的,更清潔的方式以及。

SELECT * FROM product_table WHERE price >= (SELECT price FROM product_table 
ORDER BY price DESC LIMIT 1 OFFSET (SELECT 0.1 * COUNT(*) FROM product_table)); 

我對一個非常大的數據庫運行了一個類似的查詢,並且它運行得很快。