row_number 解决分组排序功能, 语法:row_number() over (partition by 分组字段 order by 排序字段 排序方式(asc|desc) ) ,在实际使用中分组是可以省略的,即不分组直接排序,相当于直接排名的功能。 举例: rank 、dense_rank的功能同row_number,区别是row_number是在分组内按顺序排名、rank是对于相同的记录会重复,但总数不变,dense_rank对于相同的记录会重复但总数减少。 比如针对成绩排名时(假设有两个相同成绩的人), row_number 是 1 2 3 4 5 6 rank 是 1 1 3 4 5 6 dense_rank是 1 1 2 3 4 5窗口函数row_number、rank、dense_rank用法
--假如想知道每个部门中工资前三的人员。
select dept,name,salary,rn from (
select dept,name,salary,row_number() over (partition by dept order by salary desc) rn from tbl_salary
) t where rn<=3;
--假如想知道公司工资前三人员
select dept,name,salary,rn from (
select dept,name,salary,row_number() over (order by salary desc) rn from tbl_salary
) t where rn<=3;
--假如想知道每个访问网站的人的第一次访问记录,示例中仅取了两个字段,也可以用row_number来完成。
select user_id,vistit_time from (
select user_id,vistit_time,row_number() over partition by user_id order by vistit_time asc) from vistit_log
) t where rn=1