2010-06-17 29 views
4

我有一個簡單的數據表,我想從查詢中選擇大約第40個百分點的行。從MySQL中選擇第n百分位數

我可以先查詢現在這樣做的權利找到的行數,然後運行另一個查詢進行排序,並選擇第n行:

select count(*) as `total` from mydata; 

可能返回類似93,93 * 0.4 = 37

select * from mydata order by `field` asc limit 37,1; 

我可以將這兩個查詢合併爲一個查詢嗎?

+0

@OMG小馬:我假設COUNT返回93,所以第40個百分點大概是第37行(93 * 0.4)。 – 2010-06-17 21:44:32

回答

1

這會給你大約第40百分位數,它返回行數小於40%的行。它根據行距離第40個百分點的距離排序,因爲沒有行可能完全落在第40個百分點。

SELECT m1.field, m1.otherfield, count(m2.field) 
    FROM mydata m1 INNER JOIN mydata m2 ON m2.field<m1.field 
GROUP BY 
    m1.field,m1.otherfield 
ORDER BY 
    ABS(0.4-(count(m2.field)/(select count(*) from mydata))) 
LIMIT 1 
0

作爲徒勞的(當前的孤子可能會更快者優先),如果表是MYISAM(或者你可以用的InnoDB的近似住):

SET @row =0; 
SELECT x.* 
FROM information_schema.tables 
JOIN (
    SELECT @row := @row+1 as 'row',mydata.* 
    FROM mydata 
    ORDER BY field ASC 
) x 
ON x.row = round(information_schema.tables.table_rows * 0.4) 
WHERE information_schema.tables.table_schema = database() 
AND information_schema.tables.table_name = 'mydata'; 
0

還有this解決方案,它使用由GROUP_CONCAT生成的怪物字符串。我不得不起來像這樣的輸出最大,以得到它的工作:

SET SESSION group_concat_max_len = 1000000; 

MySql的奇才在那裏:隨意上的方法的相對錶現的評價。

+0

一般而言,您應該嘗試包含您發佈的任何鏈接的相關部分。這使得人們更容易瀏覽答案,並確保即使鏈接消失,答案仍然相關。 – 2015-07-24 22:12:54