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;