玖叶教程网

前端编程开发入门

大数据之-HIVE入门(十八)

窗口函数row_number、rank、dense_rank用法

row_number 解决分组排序功能, 语法:row_number() over (partition by 分组字段 order by 排序字段 排序方式(asc|desc) ) ,在实际使用中分组是可以省略的,即不分组直接排序,相当于直接排名的功能。

举例:

--假如想知道每个部门中工资前三的人员。
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


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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言