hive开窗函数中range和rows的区别

  • rows是物理窗口,是哪一行就是哪一行,与当前行的值(order by key的key的值)无关,只与排序后的行号相关,就是我们常规理解的那样。
  • range是逻辑窗口,与当前行的值有关(order by key的key的值),在key上操作range范围。
select id
,sum(id) over(order by id) default_sum
,sum(id) over(order by id range between unbounded preceding and current row) range_sum
,sum(id) over(order by id rows between unbounded preceding and current row) rows_sum
,sum(id) over(order by id range between 1 preceding and 2 following) range_sum1
,sum(id) over(order by id rows between 1 preceding and 2 following) rows_sum1
from tmp

运行结果如下
在这里插入图片描述
分析:

  • 1.当order by后面的rows/range缺失时,默认是range between unbounded preceding and current row
  • 2.关于range_sum1的range分析
    • order by id,所以要看id的值,并对key(id进行range操作),即[id-1, id+2]。注意是闭区间
    • 当id=1时,因为是对id的值在[0, 3]的行都包括在内(取id为1,1,3),所以sum(id) = 1 + 1 + 3 = 5
    • 当id=3时,因为是对id的值在[2, 5]的行都包括在内(取id为3),所以sum(id) = 3
    • 当id=6时,[5,8],sum(id) = 6 + 6 + 6 + 7 + 8 = 33
    • 当id=7时,[6,9],sum(id) = 6 + 6 + 6 + 7 + 8 + 9 = 42
    • 当id=8时,[7,10],sum(id) = 7 + 8 + 9 = 24
    • 当id=9时,[8,11],sum(id) = 8 + 9 = 17
  • 3.关于range_sum的range分析同上
    • 当id=1时,id在[-inf, 1],故sum(id) = 1 + 1 = 2
    • 当id=3时,id在[-inf, 3],故sum(id) = 1 + 1 + 3 = 5
    • 当id=6时,id在[-inf, 6],故sum(id) = 1 + 1 + 3 + 6 + 6 + 6 = 23
    • 当id=7时,id在[-inf, 7],故sum(id) = 1 + 1 + 3 + 6 + 6 + 6 + 7 = 30
    • 当id=8时,id在[-inf, 8],故sum(id) = 1 + 1 + 3 + 6 + 6 + 6 + 7 + 8 = 38
    • 当id=9时,id在[-inf, 9],故sum(id) = 1 + 1 + 3 + 6 + 6 + 6 + 7 + 8 + 9 = 47

ps: row_number不受order by key 的重复key的影响
在这里插入图片描述

  • 13
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Hive开窗函数主要分为排序开窗和聚合开窗两类。在排序开窗函数,常用的函数有row_number()、rank()、dense_rank()和percent_rank()。其,row_number()用于给每一行分配一个唯一的行号,rank()用于对组内的行进行排名,dense_rank()也是对组内的行进行排名,但排名是连续的,而percent_rank()用于计算给定行的百分比排名,可以用来计算超过了百分之多少的人。\[3\] 在使用Hive开窗函数时,可以通过rows/range between来控制窗口函数的范围。这个功能在满足业务需求时非常有用。通过使用rows/range between,可以根据自己的需求任意地控制窗口函数的范围。\[1\] 需要注意的是,在Hive开窗函数的使用是在2003年ISO SQL标准引入的,它解决了许多用SQL语句难以解决的问题。在开窗函数出现之前,很多问题都需要通过复杂的相关子查询或存储过程来解决。而开窗函数的使用使得这些经典的难题可以轻松地解决。\[2\] #### 引用[.reference_title] - *1* *3* [大数据-Hive开窗函数](https://blog.csdn.net/MsSpark/article/details/122051503)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Hive SQL主要开窗函数用法介绍](https://blog.csdn.net/weixin_43025027/article/details/124388152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值