一、rows between 与 range between 用法

1. 相关关键词解析

unbounded 无边界
preceding 往前
following 往后
unbounded preceding 往前所有行,即初始行
n preceding 往前n行
unbounded following 往后所有行,即末尾行
n following 往后n行
current row 当前行语法
(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING

2. rows between ... and ...

rows:指以行号来决定frame的范围,是物理意义上的行。

比如rows between 1 preceding and 1 following代表从当前行往前一行以及往后一行。

3. range between ... and ...

range:指以当前行在开窗函数中的值为根基,然后按照order by进行排序,最后根据range去加减上下界。是逻辑意义上的行。

比如sum(score) over (PARTITION by id order by score ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) 表示按照id分组,按照score升序排序,然后以当前行的score,下界减一,上界加一,作为范围,将这范围里的score进行加总。

讲的比较拗口,下面看个例子就懂了。

二、举例

1. 数据准备

假设有表datadev.t_student,数据如下

id score
stu_1 1
stu_1 2
stu_1 3
stu_1 4
stu_1 5
stu_1 5

2. 测试 rows between ... and ...

SELECT id, score,
sum(score) over (PARTITION by id) as a1,
sum(score) over (PARTITION by id order by score) as a2,
sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as a3,
sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as a4,
sum(score) over (PARTITION by id order by 1) as a5
from datadev.t_student;

测试结果如下:

分析:

  1. sum(score) over (PARTITION by id) as a1:按照id分组直接加总score,这种大家最熟悉了
  2. sum(score) over (PARTITION by id order by score) as a2:按照score排序,从起始行到当前行进行加总,与a3中的ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW不同的是,当score相同时,算相同排名,会一起加总。类似rank的概念。
  3. sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW):从起始行到当前行进行加总,与a2不同的是,当score相同时,排名不同,不会加总到当前行。类似row_number的概念。
  4. sum(score) over (PARTITION by id order by score ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING):从起始行到末尾行进行加总,与a1相同。
  5. sum(score) over (PARTITION by id order by 1):作用与a2一样,这里order by 1,相当于score相同,因此全部加总。

a1与a2在官网上的解释如下:

  • When ORDER BY is specified with missing WINDOW clause, the WINDOW specification defaults to RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
  • When both ORDER BY and WINDOW clauses are missing, the WINDOW specification defaults to ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

因此,a1与a2等价于

SELECT id, score,
sum(score) over (PARTITION by id) as a1,
sum(score) over (PARTITION by id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as a1,
sum(score) over (PARTITION by id order by score) as a2,
sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as a2,
from datadev.t_student;

官网地址如下:

LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundation

3. 测试 range between ... and ...

SELECT id, score,
sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as b1,
sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING) as b2
from datadev.t_student;

测试结果如下:

分析:

  1. sum(score) over (PARTITION by id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING):RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 是默认值,可不写。
  2. sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING):按照id分组,score升序排序,并将当前行的score下界减一,上界为全部(可认为是无穷大),作为筛选范围。最后将符合筛选范围的score进行相加。

b2运算过程分析如下:

id score 运算过程 运算 b2
stu_1 1 [当前行的score值 - 1,∞] ==> 即[0, ∞] 1+2+3+4+5+5=20 20
stu_1 2 [当前行的score值 - 1,∞] ==> 即[1, ∞] 1+2+3+4+5+5=20 20
stu_1 3 [当前行的score值 - 1,∞] ==> 即[2, ∞] 2+3+4+5+5=19 19
stu_1 4 [当前行的score值 - 1,∞] ==> 即[3, ∞] 3+4+5+5=17 17
stu_1 5 [当前行的score值 - 1,∞] ==> 即[4, ∞] 4+5+5=14 14
stu_1 5 [当前行的score值 - 1,∞] ==> 即[4, ∞] 4+5+5=14 14

4. 对比 range between ... and ... 与 rows between ... and ...

SELECT id, score,
sum(score) over (PARTITION by id order by score RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) as a,
sum(score) over (PARTITION by id order by score ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as b
from datadev.t_student;

测试结果如下:

分析:

id score range运算过程 range运算 a(range) rows运算过程 rows运算 b(rows)
stu_1 1 [当前行的score值 - 1,当前行的score值 + 1] ==> 即[0, 2] 1+2=3 3 将当前行的上一行以及下一行
的score进行相加
1+2=3 3
stu_1 2 [当前行的score值 - 1,当前行的score值 + 1] ==> 即[1, 3] 1+2+3=6 6 将当前行的上一行以及下一行
的score进行相加
1+2+3=6 6
stu_1 3 [当前行的score值 - 1,当前行的score值 + 1] ==> 即[2, 4] 2+3+4=9 9 将当前行的上一行以及下一行
的score进行相加
2+3+4=9 9
stu_1 4 [当前行的score值 - 1,当前行的score值 + 1] ==> 即[3, 5] 3+4+5+5=17 17 将当前行的上一行以及下一行
的score进行相加
3+4+5=12 12
stu_1 5 [当前行的score值 - 1,当前行的score值 + 1] ==> 即[4, 6] 4+5+5=14 14 将当前行的上一行以及下一行
的score进行相加
4+5+5=14 14
stu_1 5 [当前行的score值 - 1,当前行的score值 + 1] ==> 即[4, 6] 4+5+5=14 14 将当前行的上一行以及下一行
的score进行相加
5+5=10 10

参考文档:Hive 窗口与分析型函数

HIVE SQL 聚合函数与 rows between / range between详解相关推荐

  1. 第七章 SQL聚合函数 LIST

    文章目录 第七章 SQL聚合函数 LIST 大纲 参数 描述 包含逗号的数据值 LIST 和 %SelectMode LIST 和 ORDER BY 最大列表大小 相关的聚合函数 示例 第七章 SQL ...

  2. 第三章 SQL聚合函数 COUNT(一)

    文章目录 第三章 SQL聚合函数 COUNT(一) 大纲 参数 描述 没有行返回 流字段 第三章 SQL聚合函数 COUNT(一) 返回表或指定列中的行数的聚合函数. 大纲 COUNT(*)COUNT ...

  3. SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲

    SQL 聚合函数与GROUP BY NULL的关系及ALL的使用说明 需求说明 有如下一道SQL题,网友咨询: 1 为啥正确答案是第二项? 2 聚合函数是否一定要跟GROUP BY PARTITION ...

  4. 第十二章 SQL聚合函数 VARIANCE, VAR_SAMP, VAR_POP

    文章目录 第十二章 SQL聚合函数 VARIANCE, VAR_SAMP, VAR_POP 大纲 参数 描述 当前事务期间所做的更改 示例 第十二章 SQL聚合函数 VARIANCE, VAR_SAM ...

  5. 第五章 SQL聚合函数 %DLIST

    文章目录 第五章 SQL聚合函数 %DLIST 大纲 参数 描述 %DLIST 和 %SelectMode %DLIST和ORDER BY 相关的聚合函数 示例 第五章 SQL聚合函数 %DLIST ...

  6. Hive SQL时间函数及用法

    Hive SQL时间函数 当前官方提供的日期函数共27个,内容如下: 1. 获取当前系统时间 函数: current_timestamp 返回值:timestamp 返回查询计算开始时的当前时间戳(从 ...

  7. Maxcompute ODPS SQL 聚合函数

    ODPS SQL 聚合函数 ODPS SQL 聚合函数 1.COUNT:用于计算记录数. SELECT COUNT(*) FROM table_name; --******************** ...

  8. 第十三章 SQL聚合函数 XMLAGG

    文章目录 第十三章 SQL聚合函数 XMLAGG 大纲 参数 描述 XML和XMLAGG XMLAGG和ORDER BY 相关聚合函数 示例 第十三章 SQL聚合函数 XMLAGG 一个聚合函数,它创 ...

  9. 第八章 SQL聚合函数 MAX

    文章目录 第八章 SQL聚合函数 MAX 大纲 参数 描述 数据值 当前事务期间所做的更改 示例 第八章 SQL聚合函数 MAX 返回指定列中最大数据值的聚合函数. 大纲 MAX([ALL | DIS ...

最新文章

  1. ARM汇编基础详解(PS学习汇编的原因)
  2. [通俗易懂]深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
  3. 没错!Python杀死了Excel!
  4. arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots
  5. 复制assert目录文件到私有目录_每天学点之CentOS文件/目录的权限
  6. centOS 自动锁屏 解决办法
  7. Codeforces Gym 100342C Problem C. Painting Cottages 暴力
  8. linux安装eclipse教程,Linux下的Eclipse安装
  9. 【口诀】巧记泰勒公式
  10. C++数据结构——栈
  11. VBA变量和函数名中文拼音输入提示
  12. 三峡学院计算机调剂,重庆三峡学院2019考研预调剂公告
  13. python tkinter button 透明图片_如何使Tkinter支持PNG透明?
  14. 集中式自动驾驶控制域中的高精地图数据解析算法
  15. vue源码解析:vue生命周期方法$destory方法的实现原理
  16. java8中map的新方法--replace
  17. r语言lm函数找不到对象_怎么才能查看R语言某个包某函数源码?
  18. 苹果跟android性价比,苹果和其他安卓机差距越来越小,买安卓更有性价比
  19. 微信小程序的官方网址
  20. 商铺选址“风水”是门学问 大数据解读一步差三市主因

热门文章

  1. 两种 C++ 多线程编程方式,看完不懂打我...
  2. 无线图传发射模块静电浪涌测试
  3. python set类型和set()函数作用、用法等集合,让你学会用set
  4. html中怎么改变鼠标形状,css鼠标样式语法及20种可选值(属性)
  5. APM/Pixhawk飞行日志分析入门(苍穹四轴)
  6. 360大安全情报局:网友对摄像头的关注较去年提升201.5%
  7. java isnull()_java.util.Objects.isNull vs对象== nu
  8. 《来吧,一起创客》新书上市,精彩抢先看!
  9. xboxlive服务器被阻止修复教学,XBOXLIVE(xboxlive)网络测试已阻止教程/XBOX多人游戏检测已阻止...
  10. 某手安卓自动刷视频分析