SQL中的分组之后TOPN问题

SQL分组查询然后取每一组的前N条数据

由于SQL的不同的数据库SQL的语法有些略微不同,所以我们这里采用MySQL展示。

创建表

create table person
(
  id           int auto_increment
      primary key,
  name         varchar(255) collate utf8mb4_general_ci null,
  salary       varchar(200)                           null,
  departmentId varchar(255)                           null
);

插入数据

insert into person
values (‘1‘, ‘Joe‘, ‘85000‘, ‘1‘),
      (‘2‘, ‘Henry‘, ‘80000‘, ‘2‘),
      (‘3‘, ‘Sam‘, ‘60000‘, ‘2‘),
      (‘4‘, ‘Max‘, ‘90000‘, ‘1‘),
      (‘5‘, ‘Janet‘, ‘69000‘, ‘1‘),
      (‘6‘, ‘Randy‘, ‘85000‘, ‘1‘),
      (‘7‘, ‘Will‘, ‘70000‘, ‘1‘);

查询每个每个部门中薪水最高的两个人的姓名和薪水,翻译成SQL语言就是按照部门分组,然后每一组按照薪水排序,取出薪水最大的两个人。

第一种:使用SQL的分窗函数(Oracle支持,MySQL8.0以后才支持)

select name, salary
from (select name, salary, rank() over (partition by departmentId order by salary desc ) as num
    from person) tmp
where tmp.num < 3
order by name;

第二种:SQL子查询

select name, salary
from person p1
where 2 > (
  select count(p2.salary)
  from person p2
  where p1.salary < p2.salary
    and p1.departmentId = p2.departmentId
)
order by p1.name;

SQL中的分组之后TOPN问题

上一篇:oracle


下一篇:09 spark连接mysql数据库