hive中排序函数row_number、rank、dense_rank的区别

12 篇文章 2 订阅
本文详细介绍了SQL中的三种窗口函数row_number(), rank(), dense_rank(),并结合学生成绩表给出了示例。这三种函数在分组排序时用于生成自增序列,区别在于处理相同排序值时的序列号分配:row_number()不重复,rank()跳过重复值,dense_rank()继续自增。通过实例展示了它们在实际查询中的应用和结果差异。
摘要由CSDN通过智能技术生成

一、区别预览

三者通常都会配合窗口函数over(),并结合partition by order by xxx来分组排序,即形式使用:function_name over(partition by xxx order by xxx)。首先三者都是产生一个自增序列,不同的是

row_number() 排序的字段值相同时序列号不会重复,如:1、2、(2)3、4、5(出现两个2,第二个2继续编号3)

rank() 排序的字段值相同时序列号会重复且下一个序列号跳过重复位,如:1、2、2、4、5(出现两个2,跳过序号3,继续编号4)

dense_rank() 排序的字段值相同时序列号会重复且下一个序列号继续序号自增,如:1、2、2、3、4(出现两个2,继续按照3编号)


二、举例介绍

有如下学生成绩表:student_score(假设只有一个学生多门课程)

统计每个学生各科成绩由高到低排序,语句如下:

SELECT
    row_number() over(partition by name order by score DESC) AS row_number,
    rank() over(partition by name order by score DESC) AS rank,
    dense_rank() over(partition by name order by score DESC) AS dense_rank,
    name,
    subject,
    score
FROM
    student_score

统计结果如下图所示:

从上图结果可以看出区别

row_number   排序字段值相同时,序号不同,下一个序号顺序自增

rank                 排序字段值相同时,序号相同,下一个序号跳跃自增

dense_rank    排序字段值相同时,序号相同,下一个序号顺序自增


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值