mysql 值大于值数量的百分比

标签 mysql sql percentage

<分区>

我想找到年龄大于某年所有值的 n% 的名称。 这是表格:

mysql> select * from cust;
+------+------+------+
| name | age  | year |
+------+------+------+
| toni |   21 | 2016 |
| robi |   22 | 2016 |
| deni |   23 | 2016 |
| jeki |   24 | 2016 |
| yodi |   25 | 2016 |
| rino |   26 | 2016 |
| goli |   27 | 2016 |
| tobi |   28 | 2016 |
| lemi |   29 | 2016 |
| lora |   30 | 2016 |
| riko |   25 | 2017 |
| soni |   26 | 2017 |
| bino |   27 | 2017 |
| kola |   28 | 2017 |
| zoki |   29 | 2017 |
| mera |   30 | 2017 |
| noki |   31 | 2017 |
| peni |   32 | 2017 |
| vino |   33 | 2017 |
| heri |   34 | 2017 |
+------+------+------+

数据链接:

create table tbl ( name varchar(10), age int, year  int);
insert into tbl values
('toni', 21, 2016 ),
('robi', 22, 2016 ),
('deni', 23, 2016 ),
('jeki', 24, 2016 ),
('yodi', 25, 2016 ),
('rino', 26, 2016 ),
('goli', 27, 2016 ),
('tobi', 28, 2016 ),
('lemi', 29, 2016 ),
('lora', 30, 2016 ),
('riko', 25, 2017 ),
('soni', 26, 2017 ),
('bino', 27, 2017 ),
('kola', 28, 2017 ),
('zoki', 29, 2017 ),
('mera', 30, 2017 ),
('noki', 31, 2017 ),
('peni', 32, 2017 ),
('vino', 33, 2017 ),
('heri', 34, 2017 );

我想从 2017 年找到年龄大于 2016 年所有年龄的 60% 的名字。我做了这样的事情

select name from cust where year=2017 and age>
    (SELECT age
    FROM    (
        SELECT cust.*, @counter := @counter +1 AS counter
        FROM (select @counter:=0) AS initvar, cust where year=2016
        ORDER BY age DESC   
    ) AS X
    where counter <= (60/100 * @counter) 
    ORDER BY age DESC);

我知道这是错误的,但你知道我的意思是比较主查询之间的值 和子查询,但我希望子查询超过 1 行。 是否有有效但与上述类似的解决方案?

编辑:这是我想要的输出:

+------+
| name |
+------+
| soni |
| bino |
| kola |
| zoki |
| mera |
| noki |
| peni |
| vino |
| heri |
+------+

最佳答案

要在 MySQL(8 之前)中找到 2016 年的第 60 个百分位数:

select min(age)
from (select c.*, (@rn := @rn + 1) as rn
      from (select c.*
            from cust c
            where year = 2016
            order by age
           ) c cross join
           (select @rn := 0) params
     ) c
where rn >= @rn * 0.6;

要查找2017年对应的年龄,可以加入这个:

select c.* from cust c join
     (select min(age) as age_2016
      from (select c.*, (@rn := @rn + 1) as rn
            from (select c.*
                  from cust c
                  where year = 2016
                  order by age
                 ) c cross join
                 (select @rn := 0) params
           ) c
      where rn >= @rn * 0.6
     ) cc
     on c.age >= cc.age_2016 where year = 2017;

关于mysql 值大于值数量的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51570420/

相关文章:

php - mysql与php在表中添加一行

mysql - 在我的计算中添加百分号 (%)

javascript - 使用 jquery 计算 upwork 等付款的百分比

javascript - 如何使用简单的 JavaScript 代码计算百分比

PHP脚本替换数据库中文件名中的特定字符串

mysql - SQL:如何对别名计算列 ADD 添加计数进行排序?

java - 本地和远程连接池,Java DBCP

sql - 为什么引用 SQLite rowid 会导致外键不匹配?

mysql - 如何更改MySQL表的主键?

php - Wamp、MYSQL 和 ON DUPLICATE KEY UPDATE 不影响正确的行数?