在数据处理过程中很多时候会遇到需要针对数据进行分组然后获取每个分组TOP N,那么针对这样的问题应该如何处理呢?下文就使用一个示例进行介绍
知识点
分组聚合,就是先分组再排序,可以的话顺手标个排名;如果不想分组也可以排名;如果不想分组同时再去重排名也可以
ROW_NUMBER() OVER(
[PARTITION BY column_1, column_2,…]
[ORDER BY column_3,column_4,…]
)
背景
假设现在有如下一张表需要统计每个部门薪水最高的员工
如何解决问题
根据上文说明,现在就是需要根据部分进行分组然后再根据薪水进行倒序排列,SQL如下:
select id,dept_id,salary,row_number() over( partition by dept_id order by salary desc ) as rn from test.employee
查询的结果如下:
那么如何获取薪水最高的员工呢?可以使用根据排名进行筛选rn小于2的数据,SQL如下:
select id,dept_id,salary from (
select id,dept_id,salary,row_number() over( partition by dept_id order by salary desc ) as rn from test.employee
) a where a.rn<2
查询的结果是:
可以发现现在完全符合我们的预期