hive分组求topN(row_number,rank,dense_rank)

背景

求每个省份下uv前2的记录

原理

利用row_number ,rank,dense_rank函数实现

hive表

hive表:test_rank ;

province        string
city    string

uv      int

数据:

山东    潍坊    20
山东    济南    30
山东    青岛    30
山东    淄博    10
河北    石家庄  30
河北    沧州    30

河北    保定    20

例子

1) row_number ,同一个名次只能有1个,故其排名为从1开始的递增序列,如1 2 3 4 

select * , row_number() over (partition by province  order by uv desc ) as rk from test_rank ; 

山东    济南    30      1                                                       
山东    青岛    30      2
山东    潍坊    20      3
山东    淄博    10      4
河北    石家庄  30      1
河北    沧州    30      2

河北    保定    20      3


2)rank函数,同一个名次可以有多个,下个名次=当前名次+当前名次的人数 

 select * , rank() over (partition by province  order by uv desc ) as rk from test_rank ;    

山东    济南    30      1                                                       
山东    青岛    30      1
山东    潍坊    20      3
山东    淄博    10      4
河北    石家庄  30      1

河北    沧州    30      1

河北    保定    20      3


3)dense_rank函数,同一个名次可以有多个,下个名次=当前名次+1

select * , dense_rank() over (partition by province  order by uv desc ) as rk from test_rank ;

山东    济南    30      1                                                       
山东    青岛    30      1
山东    潍坊    20      2
山东    淄博    10      3
河北    石家庄  30      1
河北    沧州    30      1
河北    保定    20      2


你可能感兴趣的:(Hive)