我想知道是否有任何函数可以在MySQL中用于从包含数值的列中选择TOP X(或底部)百分比。
基本上,我有一个包含价格清单的列,我只想将这些字段退回到价格的前十个百分点。有什么建议?
答案 0 :(得分:7)
就像一个FYI(我知道这个问题已经有几年了),这可以通过其他更清洁的方式来完成。
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));
我在一个非常大的数据库上运行了类似的查询,它运行得很快。
答案 1 :(得分:6)
更新:来自更多知情人here的更深思熟虑的主题解释。尽管如此,MySQL似乎还没有嵌入式函数来计算百分位数。
尝试:
SELECT * FROM price WHERE price> =(SELECT 0.9 * max(price)FROM prices)
SELECT price FROM prices p1 WHERE
(SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <=
(SELECT 0.1 * count(*) FROM prices)
);
这将给出价格 P1 ,其中价格&gt; = P1 的 Price 表中的记录数量将是总数的十分之一价格表中的记录。 之后:
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)
);
将返回所有想要的记录。
注意:我没有检查此查询的性能,我认为使用临时表/变量的解决方案必须更有效。
答案 2 :(得分:6)
在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
<小时/>
对于MySQL,您可以计算所需的批量大小,然后LIMIT到该记录数
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