我有一個簡單的數據表,我想從查詢中選擇大約第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;
我可以將這兩個查詢合併爲一個查詢嗎?
我有一個簡單的數據表,我想從查詢中選擇大約第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;
我可以將這兩個查詢合併爲一個查詢嗎?
這會給你大約第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
作爲徒勞的(當前的孤子可能會更快者優先),如果表是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';
還有this解決方案,它使用由GROUP_CONCAT生成的怪物字符串。我不得不起來像這樣的輸出最大,以得到它的工作:
SET SESSION group_concat_max_len = 1000000;
MySql的奇才在那裏:隨意上的方法的相對錶現的評價。
一般而言,您應該嘗試包含您發佈的任何鏈接的相關部分。這使得人們更容易瀏覽答案,並確保即使鏈接消失,答案仍然相關。 – 2015-07-24 22:12:54
@OMG小馬:我假設COUNT返回93,所以第40個百分點大概是第37行(93 * 0.4)。 – 2010-06-17 21:44:32