【数据库】HIVESQL⼏种排序函数
(ROW_NUMBERRANKDENSE_RANK)
最初⽤排序函数时,只会⽤row_number,后来在⽹上⼀看,才知道由于场景不同,是有不同的函数的。
作为⼀个总结,为以后的使⽤提供帮助。
⽬录
⼀、ROW_NUMBER
  对于排序,使⽤较为⼴泛的函数就是row_number。据⽹上说可以⽤来实现web程序的分页,⼩⽩不懂开发,所以不知道如何来分页。但是,在hive中,它的⽤途还是很⼴泛的。row_number和over⼀起配对使⽤,每⼀⾏记录⽣成⼀个序号,依次排序且不会重复。
例如:现有⼀个场景,⼀张表中,有这样的记录:
同⼀个orderid和promotionid,由于修改时间不同有两条纪录,处理结果需要留下修改时间最新的记录。
select *
from (select orderid,
promotionid,
row_number() over(PARTITION BY orderid ORDER BY datachange_lasttime desc) as rank
from tablename
)a
rank函数怎么用where rank=1;
row_number的基本原理是先使⽤over⼦句中的排序语句对记录进⾏排序,然后按照这个顺序⽣成序号。
Tips:
over⼦句中的order by⼦句与SQL语句中的order by⼦句作⽤范围不同,如以下sql,over⼦句中根据SubTime降序排列,Sql语句中则按orderid降序排列。
select orderid,
promotionid,
row_number() over(PARTITION BY orderid ORDER BY datachange_lasttime desc) as rank
from tablename
order by orderid desc
;
⼆、RANK
  RANK函数是对查询结果进⾏排名,与row_number函数不同的是,rank函数考虑over⼦句中排序字段值相同的情况,如果使⽤rank 函数来⽣成序号,over⼦句中排序字段值相同的序号是⼀样的,后⾯字段值不相同的序号将跳过相同的排名号排下⼀个,也就是相关⾏之前的排名数加⼀,可以理解为根据当前的记录数⽣成序号,后⾯的记录依此类推。rank函数的使⽤⽅法与row_number函数完全相同。
select RANK() OVER(order by [UserId]) as rank,* from [Order]
三、DENSE_RANK
  dense_rank函数的功能与rank函数类似,dense_rank函数在⽣成序号时是连续的,⽽rank函数⽣成的序号有可能不连续。
dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上⼀次的rank值。在各个分组内,rank()是跳跃排序,有两个第⼀名时接下来就是第四名,dense_rank()是连续排序,有两个第⼀名时仍然跟着第⼆名。将上⾯的Sql语句改由dense_rank函数来实现。
select DENSE_RANK() OVER(order by [UserId]) as den_rank,* from [Order]