我是靠谱客的博主 敏感铃铛,最近开发中收集的这篇文章主要介绍【数据库】HIVE SQL几种排序函数(ROW_NUMBER&RANK&DENSE_RANK)一、ROW_NUMBER二、RANK三、DENSE_RANK,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最初用排序函数时,只会用row_number,后来在网上一看,才知道由于场景不同,是有不同的函数的。

作为一个总结,为以后的使用提供帮助。

目录

一、ROW_NUMBER

二、RANK

三、DENSE_RANK


一、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
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]

 

 

最后

以上就是敏感铃铛为你收集整理的【数据库】HIVE SQL几种排序函数(ROW_NUMBER&RANK&DENSE_RANK)一、ROW_NUMBER二、RANK三、DENSE_RANK的全部内容,希望文章能够帮你解决【数据库】HIVE SQL几种排序函数(ROW_NUMBER&RANK&DENSE_RANK)一、ROW_NUMBER二、RANK三、DENSE_RANK所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部