mysql 值大于值数量的百分比

mysql value greater than percent of number of values

我想找到某个年份中年龄大于所有值的 n% 的名称。 这是 table:

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 |
+------+------+------+

DDL:

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 年的相应年龄,您可以join这个:

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;

试试这个简单的查询:

select name
from tbl t
where (select count(*) from tbl where year = 2016 and age <= t.age) /
      (select count(*) from tbl where year = 2016) >= 0.6 
  and year = 2017;

where 子句中,您只需将 2016 年的年轻人数除以 2016 年的所有人口,即可得到百分比(0.01.0)。所以,只需要取那些大于或等于 0.6.