为MySQL中的数值选择TOP X(或bottom)百分比

时间:2011-01-19 21:55:12

标签: sql mysql select

我想知道是否有任何函数可以在MySQL中用于从包含数值的列中选择TOP X(或底部)百分比。

基本上,我有一个包含价格清单的列,我只想将这些字段退回到价格的前十个百分点。有什么建议?

3 个答案:

答案 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

<小时/>

OLD ANSWER

对于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