窗口函数简介与总结

news2024/11/14 19:28:46

目录

什么是窗口函数

窗口函数的实现原理

窗口函数使用场景

常用的窗口函数有:

1.  窗口排序函数:ROW_NUMBER()、RANK()、DENSE_RANK();

2. 窗口聚合函数:SUM()、MIN()、MAX()、AVG();

3. LAG()

4. LEAD()

5. FIRST_VALUE()

6. LAST_VALUE()

7. NTILE()


什么是窗口函数

窗口函数是 SQL 中一类特别的函数。和聚合函数相似,窗口函数的输入也是多行记录。不 同的是,聚合函数的作用于由 GROUP BY 子句聚合的组,而窗口函数则作用于一个窗口, 这里,窗口是由一个 OVER 子句 定义的多行记录。聚合函数对其所作用的每一组记录输 出一条结果,而窗口函数对其所作用的窗口中的每一行记录输出一条结果。一些聚合函 数,如 sum, max, min, avg,count 等也可以当作窗口函数使用。

窗口函数的实现原理

在用group-by处理数据分组时,每一行只能进入一个分组。窗口函数基于称为框(f r a m e)的一组行,计算表的每一输入行的返回值,每一行可以属于一个或多个框。常见用例就是查看某些值的滚动平均值,其中每一行代表一天,那么每行属于7个不同的框。

如下图所示,每一行是如何匹配多个窗口框的。

窗口函数使用场景

分组排序,如取某年级每个班学习成绩排名前10的学生。分组聚合基本语法

窗口函数的语法分为四个部分:

函数子句:指明具体操作,如sum-求和,first_value-取第一个值;partition by子句:指明分区字段,如果没有,则将所有数据作为一个分区;order by子句:指明了每个分区排序的字段和方式,也是可选的,没有就是按照表中的顺序;窗口子句:指明相对当前记录的计算范围,可以向上(preceding),可以向下(following),也可以使用between指明,上下边界的值,没有的话默认为当前分区。ROWS BETWEEN,也叫做window子句数字+PRECEDING 向前n条数字+FOLLOWING 向后n条CURRENT ROW 当前行UNBOUNDED 无边界,表示从最前面的起点开始,表示到最后面的终点UNBOUNDED PRECEDING 向前无边界UNBOUNDED FOLLOWING 向后无边界窗口函数有哪些

窗口函数的功能分为:聚合、取值、排名、序列四种,前三种的使用场景比较常见,容易理解,最后一种(序列)的使用场景比较少。

聚合count 统计条数sum 求和avg 求平均值max 求最大值min 求最小值取值first_value 取窗口中的第一值last_value 取窗口中的最后一个值lag(col, n, DEFAULT) 用于统计窗口内向上第n行的值col :列名n:向上n行,[可选,默认为1]DEFAULT :当向上n行为NULL时,取默认值;如果不指定,则为NULLlead(col, n, DEFAULT) 用于统计窗口内向下第n行的值,和lag相反col :列名n:向下n行,[可选,默认为1]DEFAULT :当向上n行为NULL时,取默认值;如果不指定,则为NULL排序rank 排序,有相同分数,排名相同并对后续跳过,如分数5,5,8,9,则得到的结果未1,1,3,4dense_rank 排序,有相同的分数排名相同,但后续接上,如分数5,5,8,9,则得到的排序结果未1,1,2,3、row_number 排序,相同分数按先来后到排序,无重复排序,如分数5,5,8,9,得到的结果为1,2,3,4ntitle其他cume_dist 小于等于当前值的行数/分组内总行数比如,统计小于等于当前薪水的人数,所占总人数的比例percent_rank 计算给定行的百分比排名。分组内当前行的RANK值-1/分组内总行数-1,可以用来计算超过了百分之多少的人。ntile(n) 将分区中的数据按照顺序划分为N片,返回当前片的值。注1:如果切片分布不均匀,默认增加第一个切片的分布注2:不支持rows between

 

在构建数据仓库或者进行数据分析时,难免会使用Hive中的窗口函数完成一些较复杂的ETL工作,现对Hive中常用的窗口函数进行总结与记录。

在Hive中,一般会使用窗口函数生成新的一列,使用样式为:

select 字段1, 字段2,..., window_function() over(partition by 字段1 order by 字段2 )  as 新字段1 from 表1 where ......

常用的窗口函数有:

1.  窗口排序函数:ROW_NUMBER()、RANK()、DENSE_RANK();

基于上文中的使用样式,窗口排序函数是先根据字段1进行分组,组内根据字段2进行升序排序或降序排序,然后新生成的一列为排序的序号,三个排序函数之间有一些区别如下。

  • ROW_NUMBER()函数,生成的排序序号从1开始,按照顺序,生成分组内记录的序号,不存在相同序号。
  • RANK()函数,生成的排序序号从1开始,字段2数值相同的行,序号相同,且会在排序序号中留下空位。
  • DENSE_RANK()函数,生成的排序序号从1开始,对于字段2数值相同的行,序号相同,但在排序序号中不会留下空位。

2. 窗口聚合函数:SUM()、MIN()、MAX()、AVG();

窗口聚合函数可以搭配窗口子句使用, 如:

select 字段1,字段2, ..., sum(字段3) over( partition by 字段1 order by 字段2 rows between unbounded preceding and current row) as 新字段1 
// 新字段1含义为计算当前分组中,从第一行到当前行字段3的和。

其中ROWS BETWEEN叫窗口子句, 其中CURRENT ROW表示当前行,UNBOUNDED PRECEDING表示前面的起点,UNBOUNDED FOLLOWING表示后面的终点,当没有写窗口子句时,语义为从第一行到当前行。

MIN()、MAX()、AVG()的用法与SUM()一样。 

3. LAG()

LAG(col,n,DEFAULT) 用于取窗口内列col往前第N行的值,其中第一个参数为列名,第二个参数表示往前取n行(可选,默认为1),第三个参数为默认值(当列col往前第n行为NULL时,取该默认值,如不指定,则为NULL)。

4. LEAD()

LEAD(col, n, DEFAULT) 与函数LAG类似,不过取数方向相反,用于去窗口内列col往后第n行的值,其中第一个参数为列名,第二个参数表示往后取n行(可选,默认为1),第三个参数为默认值(即当列col往后取n行为NULL时,取该默认值,若不指定,则为NULL)。

5. FIRST_VALUE()

用法:FIRST_VALUE(col), 表示分组排序后,截止到当前行排名第一的那一行对应的列col的值。

6. LAST_VALUE()

用法:LAST_VALUE(col),表示分组排序后,截止到当前行排名最后一名的那一行对应的列col的值。

7. NTILE()

NTILE函数的作用是,对数据分组排序后,将有序的数据平均分配到指定数量的桶中,即给每一行一个桶的编号。用法:NTILE(n) OVER(PARTITION BY 字段1 ORDER BY 字段2)。基于此,可以在查询结果的外面再嵌套一层查询语句,这样就可以过滤出排序之后的前N分之几或者后N分之几的数据,达到数据抽样的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

88.Django中间件的说明与使用方法

1. 概述 ​ AOP(Aspect Oriented Programming ),面向切面编程,是对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。可以实现在…

css-实现卡牌的发牌和翻牌动画

场景描述: 打开抽卡界面,卡牌出现并发牌至固定的位置,此时展示的是卡牌的背面;用户点击卡牌时,卡牌进行翻转,并展示卡牌内容,或者发牌后自动进行翻转和展示。 本实例在页面挂载后自动播放动画&…

前端网站动态主题色解决方案

动态主题色替换分两种:UI 组件库主题色替换和系统主题色替换。 组件库 UI 动态主题替换现阶段只在 Element-UI 和 Vant-UI 测试过,根据排查这种方案应该适用于所有类似的动态主题色替换场景。 1. UI 组件库主题色替换 在进入到这一部分之前,…

力扣232 - 用栈实现队列【C语言实现】

用栈实现队列~一、题目描述二、思路分析三、代码详解1、结构声明与展开剖析2、入队【入栈思想】3、获取队头【出栈思想】4、出队【复用思想】5、逐步算法图解四、整体代码展示💻C语言代码实现五、总结与提炼一、题目描述 示例 1: 输入: [“My…

Java基础知识+必考面试题(分享收藏版)

在学习Java语言之前,我们要了解相关知识体系,才能更好的掌握学习。那么下面我们就一起来学习JAVA语言吧~ Java语言概述 Java语言是Sun公司在1995年推出的高级编程语言,编程语言就是计算机语言,人们可以通过使用编程语言让计算机完…

Webfunny 创始人:Skywalking × Zabbix 与观纵探索可观测性

作为 Webfunny 的 PMC,应伟长期致力于前端监控、埋点探针的产品研发,伴随着全链路监控的探索,在整合 Skywalking 与 Zabbix 打造一体化监控平台的实践中,是怎样的心路历程? “ 从前端监控到全链路监控的挑战 Webfun…

Mockplus Cloud updated传达设计意图的新方法

Mockplus Cloud updated传达设计意图的新方法 增加了Mockplus Cloud UI 2.0,使UI更加直观和简洁。 引入了注解,为向开发人员传达设计意图提供了一种新的方式。 添加了上传图像以进一步解释任务注释的功能。 优化任务创建以改善用户体验。 提高了下载、导…

BUUCTF·鸡藕椒盐味·WP

来源:https://buuoj.cn/challenges#%E9%B8%A1%E8%97%95%E6%A4%92%E7%9B%90%E5%91%B3 分析 鸡藕椒盐味奇偶校验位 ~验证码如下:1100 1010 0000 ,而且打印的时候倒了一下。把答案哈希一下就可以提交了~ 验证码是二进制数,但是题目也提示了这…

【Linux】了解系统整体状态-top命令

Top命令 查看系统整体状态,只能查看当前系统的大概情况 整个机器CPU 内存使用情况 IO使用情况 CPU(s):0.0% CPU使用情况 %us:user CPU time 用户占用CPU百分比 %sy:system CPU time 内核空间占用CPU百分比 %ni&#x…

Node的web编程(三)

一、jQuery中对ajax封装 1、底层封装:封装了XMLHttpRequest对象,既可以发送get请求,也可以发送post请求 $.ajax({ url:服务器地址, type:请求方式, data:{ //客户端向服务器发送的请求数据 参数名1&#x…

SolidWorks弯曲的波纹管制作教程

如何使用SolidWorks制作波纹管呢?可能很多小伙伴都会做,那完全的波纹管如何制作呢?有的小伙伴可能不止一种方法,可能有很多方法,可以用扫描路径等,下面我用其他方法去实现下面效果图 首先新建一个零件,选前视基准面,画一个40MM的圆,如下图 然后用拉伸凸台命令,长度给…

.net----结构和枚举

结构和枚举结构结构的声明和调用声明调用结构:结构的成员枚举枚举的使用枚举:Flags枚举结构 轻量级的类,与类很相似,均为包含数据成员和函数成员的数据结构 结构与类的区别 结构是值类型且被称为具有值语义;而类是引…

【Lilishop商城】No2-2.确定软件架构搭建一(本篇包括MVC框架、持久框架、缓存、认证工具、安全框架等)

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 上一篇已经看了项目的开发架构,都需要哪些技术,都按照哪些规范,都哪…

免杀Backdoor-factory

Patch ● 通过替换EXE、DLL、注册表等方法修复系统漏洞或问题的方法 ● BDF:向二进制文件中增加或者删除代码内容 ○ 某些受保护的二进制程序无法patch ○ 存在一定概率文件会被patch坏掉 后门工厂 ● 适用于windows PE x32/x64和Linux ELF x32/x64(OSX) ● 支持…

【JVM】内存模型:原子性、可见性、有序性的问题引出与解决

一、内存模型 很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模型】是 Java MemoryModel(JMM)的意思。 简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量、数组)时&#x…

(七)RabbitMQ持久化

RabbitMQ持久化1、概念2、队列持久化3、消息持久化4、不公平分发5、预取值1、概念 默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事:我们需要将队列和消息都标记为持久化…

广义OOD检测最新综述

arXiv在2021年10月21日上传的论文**“Generalized Out-of-Distribution Detection: A Survey“,作者来自新加坡的南洋理工大学(NTU)和美国的威斯康星大学Madison分校**。 OOD检测对确保机器学习系统的可靠性和安全性至关重要,例如…

秦皇岛科学选育新品种 国稻种芯·中国水稻节:河北谱丰收曲

秦皇岛科学选育新品种 国稻种芯中国水稻节:河北谱丰收曲 冀时客户端报道(河北台 张志刚 米弘钊 赵永鑫) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 国稻种芯中国水稻节 中国农民丰收节国际贸易促进会 中国三农智库网-功能性农业农业…

Java对象拷贝原理剖析及最佳实践

作者:宁海翔 1 前言 对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po、Dto、Do、Vo各个表现层数据的转换,也存在于系统交互如序列化、反序列化。 Java对象拷贝分为深拷贝和浅拷贝,目前常用的属性拷…

2023年系统规划与设计管理师-学习计划安排

一.学习计划和安排: 序号 学习内容 分数以及题型 学习安排 完成日期 1 浏览教程, 了解知识结构 1天 11/24 2 前三章内容: 课本, 单元练习, 思维导图, 总结归纳, 第一遍背诵 分数占…