Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为MySQL中的数值选择顶部X(或底部)百分比_Sql_Mysql_Select - Fatal编程技术网

为MySQL中的数值选择顶部X(或底部)百分比

为MySQL中的数值选择顶部X(或底部)百分比,sql,mysql,select,Sql,Mysql,Select,我想知道MySQL中是否有任何函数可以用于从包含数值的列中选择顶部Xor底部百分比 基本上,我有一个包含价格列表的列,我只想返回价格前10%的字段。有什么建议吗 更新:更多有知识的人对主题进行了更深思熟虑的解释。尽管如此,MySQL中似乎仍然没有嵌入式函数来计算百分位数 尝试: 从价格中选择*,其中价格>=从价格中选择0.9*最大价格 这将给出价格P1,价格表中价格>=P1的记录数将是价格表中记录总数的十分之一。 之后: SELECT * FROM prices WHERE price >

我想知道MySQL中是否有任何函数可以用于从包含数值的列中选择顶部Xor底部百分比

基本上,我有一个包含价格列表的列,我只想返回价格前10%的字段。有什么建议吗

更新:更多有知识的人对主题进行了更深思熟虑的解释。尽管如此,MySQL中似乎仍然没有嵌入式函数来计算百分位数

尝试:

从价格中选择*,其中价格>=从价格中选择0.9*最大价格

这将给出价格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)
);
将返回所有需要的记录

注意:我并没有检查这个查询的性能,我认为使用临时表/变量的解决方案必须更有效。

EDIT-new answer 回答

对于最低百分比,只需按相反顺序排列即可

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

仅供参考,我知道这个问题已经存在了几年,也可以用其他更干净的方法来解决

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));

我在一个非常大的数据库上运行了一个类似的查询,它运行得非常快。

如果MySQL支持专门针对这种情况的分析,那就好了,但是行数、密集排名、领先和落后。。。您的查询必须计算派生表/内联视图中的百分比,以便根据它进行筛选/排序。这不是第90个百分比的含义。。。您的查询将选择价格为最高价格商品90%的行。@Matthew您说得对。我想弄清楚区别是什么:@Victor 90%百分位数意味着超过90%的值这样做会导致3次扫描。。。对我来说似乎有点低效。我在回答中也反映了这一点,但这不是在按价格计算排名前10%的行,而不是价格排名前10%的所有行,这似乎是问题所要求的每个接受的答案;虽然有点含糊不清,但确实很好@推迟DESC获得顶级公正订单的日期,并将50/100更改为10/100。谢谢,这正好派上用场。“限制1”的目的是什么?这是否不限制结果从偏移量的值开始仅为1?限制1将给出90%的准确值。这个答案有MySQL版本吗?我似乎无法获取偏移量以从select语句中获取值,从product_Table中选择0.1*COUNT*。我前面没有安装MySQL,但您可以对计数进行子查询吗?基本上,从product_表a的select count*中选择0.1*a.count;
SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table;
PREPARE STMT FROM ‘SELECT * FROM tbl ORDER BY price DESC LIMIT ?’;
EXECUTE STMT USING @rows;
select top 10 PERCENT *
FROM TBL
ORDER BY price
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));