Hive 排名函数ROW_NUMBER、RANK()、DENSE_RANK等功能介绍、对比和举例

这篇具有很好参考价值的文章主要介绍了Hive 排名函数ROW_NUMBER、RANK()、DENSE_RANK等功能介绍、对比和举例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. ROW_NUMBER()

2. RANK()

3. DENSE_RANK()

4. NTILE()

5. CUME_DIST()

6. PERCENT_RANK()


1. ROW_NUMBER()

  功能:ROW_NUMBER() 函数为每个分组内的行提供唯一的序列号,从1开始。如果在 OVER() 子句中使用 ORDER BY 语句,它将根据指定的列值对行进行排序。

  对比

   每个行都会获得一个唯一的排名数字。
   即使两行的排序列值相同,它们也会获得连续的排名,不会有相同的排名值。

  举例: 

SELECT name, score, ROW_NUMBER() OVER (ORDER BY score DESC) as rank
FROM students;

  说明:假设 students 表包含学生的名字和分数。上述查询将根据分数降序排列学生,并为每个学生分配一个唯一的序列号作为排名。如果两个学生分数相同,他们将获得连续的排名编号。

2. RANK()

    功能:RANK() 函数在分组内为行提供排名,从1开始。如果两行或多行在 ORDER BY 子句中指定的排序列上的值相等,则它们将获得相同的排名,并且排名数字会跳过。

    对比

    如果有相同值的行,它们将共享相同的排名。
    在相同值的行之后的排名会跳过那些共享排名的行数。例如,如果有两行共享排名1,那么下一个排名将是3。

    举例:

SELECT name, score, RANK() OVER (ORDER BY score DESC) as rank
FROM students;

   说明:使用与 ROW_NUMBER() 相同的数据,RANK() 函数将为分数相同的学生分配相同的排名。如果两个学生的分数相同,他们将共享排名,例如都是排名1,下一个学生的排名将是3(假设只有两个学生分数相同)。

3. DENSE_RANK()

   功能:DENSE_RANK() 函数与 RANK() 函数类似,为分组内的行提供排名,但是它不会跳过排名数字。

   对比:

    与 RANK() 类似,相同值的行会获得相同的排名。
    不同于 RANK(),DENSE_RANK() 在相同值的行之后不会跳过排名数字。例如,如果有两行共享排名1,那么下一个排名将是2。

   举例:

SELECT name, score, DENSE_RANK() OVER (ORDER BY score DESC) as rank
FROM students;

   说明:使用与 RANK() 相同的数据,DENSE_RANK() 函数也会为分数相同的学生分配相同的排名。不同之处在于,它不会跳过排名,所以在上述例子中,下一个学生的排名将是2,而不是3。

4. NTILE()

   功能:NTILE() 函数将分组内的行分配到指定数量的桶中,并为每个行提供桶的编号。这对于数据分区和分布式处理很有用。

   对比

    NTILE() 用于更均匀地分配行到固定数量的桶中,而不是基于其值的排名。
    它更适合于当你需要将数据均匀地分成几部分时使用。

   举例:

SELECT name, score, NTILE(4) OVER (ORDER BY score DESC) as bucket
FROM students;

  说明:假设我们想要将学生根据分数高低分成4个桶。NTILE(4) 将学生分成四个组,每个组有相近数量的学生,并为每个学生分配一个桶编号。

5. CUME_DIST()

    功能CUME_DIST() 函数计算每个记录的累计分布百分比。这个函数返回一个介于 0 和 1 之间的值,表示小于或等于当前记录值的所有记录所占的比例。计算方式是 number of rows preceding or peer with the current row / total rows

    对比:

    这是一个统计函数,用于计算行在整体分布中的位置。
    它不提供排名,而是提供了每行相对于整个数据集的位置度量。

    举例:

SELECT name, score, CUME_DIST() OVER (ORDER BY score DESC) as cume_dist
FROM students;

  说明:这将计算每个学生的累积分布值。在上述查询中,每个学生的 cume_dist 值表示有多少比例的学生分数低于或等于该学生。在这个例子中,每个学生的成绩会根据分数从高到低计算出一个累计分布百分比。例如,如果有 10 名学生,当前学生是按成绩排序后的第 3 名,那么前三名(包括当前学生)的学生数占总学生数的比例即为当前学生的累计分布百分比。如果前三名的成绩相同,那么这三名学生的累计分布百分比相同,都是 0.3。

6. PERCENT_RANK()

    功能PERCENT_RANK() 函数计算每个记录在结果集中的相对排名百分比。这个函数会返回一个介于 0 和 1 之间的值,其中 0 表示排名最高(第一位),而 1 表示排名最低(最后一位)。计算方式是 (rank - 1) / (total rows - 1)

   对比

     PERCENT_RANK() 提供了一个介于0和1之间的数值,这个数值表示当前行的相对排名。
    它用于确定行在其分组内的相对位置,而不是一个绝对的排名数字。

    举例:

SELECT name, score, PERCENT_RANK() OVER (ORDER BY score DESC) as percent_rank
FROM students;

   说明:在这个例子中,每个学生的成绩会根据分数从高到低计算出一个百分比排名。第一名的学生百分比排名是 0,最后一名的百分比排名是 1,其他学生的百分比排名介于两者之间。文章来源地址https://www.toymoban.com/news/detail-834147.html

到了这里,关于Hive 排名函数ROW_NUMBER、RANK()、DENSE_RANK等功能介绍、对比和举例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive的Rank排名(rank函数,dense_rank函数,row_numer函数)

    一、区别: 三者通常都会配合窗口函数over(),并结合partition by order by xxx来分组排序,即形式使用:function_name over(partition by xxx order by xxx)。首先三者都是产生一个自增序列,不同的是 row_number( ) 排序的字段值相同时序列号不会重复,如:1、2、(2)3、4、5(出现两个2,第二个

    2023年04月17日
    浏览(42)
  • [hive] 窗口函数 ROW_NUMBER()

    在 Hive SQL 中, ROW_NUMBER() 是一个用于生成行号的窗口函数。 它可以为 查询结果集中的每一行分配一个唯一的行号 。 以下是 ROW_NUMBER() 函数的基本语法: PARTITION BY 子句可选,用于指定 分区列 ,它将结果集划分为不同的分区。 每个分区内的行都会有独立的行号计数,即行号

    2024年02月07日
    浏览(38)
  • hive limit分页查询、row_number()分页查询

       hive执行limit语句报错,分页失败 如: 2.1 row_number()的使用   (1)按照deptno分组,不排序   (2)按照empno进行排序,不分组,排序列命名rownum   (3)按照empno排序,同时根据deptno进行分组 2.2 分页   从原表中查询第6到第10行数据 注:   row_number最好写一个 临时

    2023年04月08日
    浏览(42)
  • mysql之row_number函数

    1.语法 #将字段按照COLUMN1分组COLUMN2排序后分配一个从1开始升序的编号 PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。 PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。 ORDER BY子句定义

    2024年02月03日
    浏览(37)
  • SQL删除重复的记录(只保留一条)-窗口函数row_number()

    关于删除mysql表中重复数据问题,本文中给到两种办法:聚合函数、窗口函数row_number()的方法。 (注意:MySQL从8.0开始支持窗口函数) 测试数据准备:首先创建一个测试表test,插入一些测试数据,模拟一些重复数据(最终目标:删除重复数据,但不处理null行) 先查询下重复数

    2024年02月05日
    浏览(47)
  • row_number 和 cte 使用实例:按照队列进行数据抵消

    今天无聊的翻了翻以前的论坛的帖子。。。嗯,想把一些没有什么价值的消息记录给删除掉,就是那些专家分获取记录。 毕竟,现在论坛已经改名叫社区了,也取消了专家分这个设置了。 在进行记录删除前,老顾觉得,有些比较有意思的问题,还是把记录保留下来,比在所

    2024年02月16日
    浏览(37)
  • GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要: 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。 迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 这种问题大部分都是因为PARTITI

    2024年02月06日
    浏览(70)
  • MySQL 实现row_number() over(partition by ) 分组排序功能

    语法格式:   row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by,但不晚于 order by 的执行。   创建测试环境 在线数据库 http://sqlfiddle.com/   1. 创建表   2. Oracle row_number() over(partition by) 分组排序功能   3. M

    2024年02月15日
    浏览(41)
  • mysql8之前如何实现row_number() over(partition by xxx order by xxx asc/desc)

    最近笔者在进行对广告业务的数据统计时遇到这种情况,业务方嫌弃离线数仓太慢,又无需太高的实时性本该使用即席查询的OLAP去做,但是当前公司调研的OLAP还没有推到广告业务侧,无奈只得使用mysql暂时顶一下。我们当前使用的是mysql5.7。 一充用户 :当日只有一次充值的

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包