想象这样一种场景,既想保留所有数据,又想得到按某几列分组的聚合值,或者再对数据进行排序,要如何实现呢?这时候开窗函数就有了用武之地,聚合函数每组只保留一个值,而开窗函数可以在不减少原表行数的情况下,实现分组和排序的功能。

目录

  • 语法规则
  • 排位函数
  • 聚合函数
  • 偏移函数
  • 分布函数

语法规则

窗口函数 over (partition by <用于分组的列名> order by <用于排序的列名> [desc] <倒序排列>)

排位函数

括号里留空,不写参数

  1. rank() 相等的值排名相同,但若有相等的值,则序号从1到n不连续。如果有两个人都排在第3名,则没有第4名。
  2. dense_rank() 相等的值排名相同,但序号从1到n连续。如果有两个人都排在第3名,则第五个人排在第4名。
  3. row_number() 相等的值对应的排名不同,序号从1到n连续。可以理解为行号。
select *,rank() over (partition by class order by score desc) as ranking,dense_rank() over (partition by class order by score desc) as dese_rank,row_number() over (partition by class order by score desc) as row_num
from test.demo_windows;

聚合函数

sum(),count(),max(),min(), avg() 等
聚合函数作为窗口函数相当于截止到当前数据的累计值

select *,sum(score) over (partition by class order by score desc) as current_sum,avg(score) over (partition by class order by score desc) as current_avg,count(score) over (partition by class order by score desc) as current_count,max(score) over (partition by class order by score desc) as current_max,min(score) over (partition by class order by score desc) as current_min
from test.demo_windows;


从上图的结果我们可以发现,当order by 排序的字段相同时,相同的数据会一起计算出来,要注意计算的是截止到当前值而不是当前行。如果要实现逐行累计,则需要添加语句:

rows between unbounded preceding and current row

表明范围,从第一行到当前行

select *,sum(score) over (partition by class order by score desc rows between unbounded preceding and current row) as current_sum,avg(score) over (partition by class order by score desc rows between unbounded preceding and current row) as current_avg,count(score) over (partition by class order by score desc rows between unbounded preceding and current row) as current_count,max(score) over (partition by class order by score desc rows between unbounded preceding and current row) as current_max,min(score) over (partition by class order by score desc rows between unbounded preceding and current row) as current_min
from test.demo_windows;

偏移函数

  1. lead(col,n,默认值) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值,当往下第n行为NULL时取默认值,如不指定则为NULL。
  2. lag(col,n,默认值) :与lead相反,用于统计窗口内往上第n行值。
  3. first_value():取分组内排序后,截止到当前行,第一个值
  4. last_value(): 取分组内排序后,截止到当前行,最后一个值
select *,
lead(name,1) over (partition by class order by score desc) as lead_1,
lead(name,1,999) over (partition by class order by score desc) as lead_null,
lag(name,1) over (partition by class order by score desc) as lag_1,
lag(name,1,999) over (partition by class order by score desc) as lag_null,
first_value(name) over (partition by class order by score desc) as first_value,
last_value(name) over (partition by class order by score desc) as last_value
from test.demo_windows ;

分布函数

  1. ntile(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布,各个切片能放的数据条数最多相差1。
    按分位数统计的时候可以用,比如取销量前四分之一的数据,筛选ntile(4) = 1 即为想要的结果
select *, ntile(2) over (partition by class order by score desc) as nt_2, ntile(3) over (partition by class order by score desc) as nt_3
from test.demo_windows ;

  1. CUME_DIST() 小于等于当前值的行数/分组内总行数;如果是降序排列,则统计大于等于当前值的行数/总行数。
  2. PERCENT_RANK() 分组内当前行的RANK值-1/分组内总行数-1。
select *,
cume_dist() over (partition by class order by score desc) as cume_dist,
percent_rank() over (partition by class order by score desc) as percent_rank
from test.demo_windows ;

参考文章:
https://zhuanlan.zhihu.com/p/92654574
https://blog.csdn.net/dingchangxiu11/article/details/83145151

hive开窗/窗口函数相关推荐

  1. Hive 中的wordCount、Hive 开窗函数

    Hive 中的wordCount.Hive 开窗函数 目录 Hive 中的wordCount.Hive 开窗函数 Hive 中的wordCount Hive 开窗函数 测试数据 建表语句 1.row_ ...

  2. Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越来越多的分析函数,用于完成负责的统计分析.抽时间将所有的分析窗 ...

  3. Hive分析窗口函数系列文章

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  4. Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

    GROUPING SETS 该关键字可以实现同一数据集的多重group by操作.事实上GROUPING SETS是多个GROUP BY进行UNION ALL操作的简单表达,它仅仅使用一个stage完 ...

  5. hive 开窗函数_Hive的架构剖析

    本文主要介绍Hive的架构和以及HQL的查询阶段,主要内容包括: Hive的架构 架构中的相关组件介绍 HQL的查询阶段 Hive的架构 hive的基本架构图如下图所示: 相关组件介绍 数据存储 Hi ...

  6. Hive 的窗口函数

    本文首发于:微信公众号[大数据每日哔哔,文章:Hive SQL 窗口函数 在 SQL 中有一类函数叫做聚合函数,例如 sum().avg().max().min() 等等,这类函数可以将多行数据按照规 ...

  7. Hive SQL 窗口函数

    本文首发:大数据每日哔哔-Hive SQL 窗口函数 Hive 的窗口函数 在 SQL 中有一类函数叫做聚合函数,例如 sum().avg().max().min() 等等,这类函数可以将多行数据按照 ...

  8. HIVE:窗口函数,用sql语句查询MySQL安装路径和版本

    数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...

  9. hive的窗口函数详解

    1.1 hive窗口函数 窗口函数是什么鬼? 窗口函数指定了函数工作的数据窗口大小(当前行的上下多少行),这个数据窗口大小可能会随着行的变化而变化.窗口函数和聚合函数区别? 窗口函数对于每个组返回多行 ...

最新文章

  1. Haproxy配置文件详解
  2. 【ORACLE SQL 语言】SQL语言四大类
  3. verilog设计简易正弦波信号发生器_电子设计竞赛教程-信号源类
  4. SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据
  5. 8个必备的Python GUI库
  6. cad中简单流程图制作_Excel vba 简单制作流程图方法介绍
  7. Insufficient space for shared memory file 解决办法
  8. 博客主之自我介绍(不长,随便瞅瞅)
  9. 【Java毕设项目】二十项毕设项目(附源码课件)
  10. 图形推理1000题pdf_公务员考试:遇到图形推理题就烦恼?5招教你练成最强大脑...
  11. 供应链优势持续赋能 国美生态圈日趋完善
  12. 大数据人工智能行业技术图谱
  13. Linux文件属性的777权限
  14. 使用spire.doc for java为word添加页码、文字水印、书签(去除警告信息)
  15. JAVA学习记录(冲冲冲)
  16. LaTex特殊字符和符号
  17. Yolo 一文看懂目标检测
  18. 为什么工厂要实现自动化、智能化?
  19. VB不能加载MSCOMCTL.OCX所需文件
  20. 小程序(微信公众平台)监控警告来源-【JS脚本错误】

热门文章

  1. 计算机控制adda转换实验报告,ADDA实验报告
  2. 【数据结构】直接插入排序以及时间复杂度的分析
  3. cpu可以直接识别并执行的计算机语言是,计算机硬件能够直接识别的指令是什么...
  4. 2020.11.17【读书笔记】丨ONT 测序平台送样指导——DNA 取样要求
  5. 移动端长按文本选择复制
  6. Navicat设置表的外键
  7. ArcGIS生成矢量的分层设色地形图
  8. 成为IT精英,我奋斗了七年
  9. 01005英制_高精度转换和格式化英制距离(英尺和英寸)
  10. JAVA基础数据类型转化