MySQL之窗口函数
目录
1、窗口函数基本概念
2、窗口函数和普通聚合函数的区别
3、常见的窗口函数
4、窗口函数的使用
5、示例代码
聚合函数也可以作为窗口函数(聚合函数VS窗口函数)
常见窗口函数的使用
编辑给窗口指定别名
怎么样得到各部门工资排名前N名员工列表?查找各部门每人工资占部门总工资的百分比?累计求和如何计算?
对于这样的需求,使用传统的SQL实现起来比较困难。这类需求不是简单的聚合可以实现的,费时费力且性能低下,难以维护。要解决此类问题,最方便的就是使用窗口函数。
1、窗口函数基本概念
MySQL从8.0开始支持窗口函数,这个功能在大多数据库中早已支持,有的也叫分析函数。窗口的概念非常重要,它可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数对于每条记录都要在此窗口内执行函数。简单的说窗口函数就是对于查询的每一行,都使用与该行相关的行进行计算。
窗口函数也叫OLAP函数(Online Analytical Processing,联机分析处理),可以对数据进行实时分析处理。窗口函数和group by有类似之处,其区别在于窗口会对每个分组之后的数据进行分别操作,而group by一般对分组之后的函数使用聚合函数汇总。
窗口的定义:
2、窗口函数和普通聚合函数的区别
①聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记录执行完还是几条。
②聚合函数也可以用于窗口函数。
3、常见的窗口函数
名称 | 参数 | 描述 |
ROW_NUMBER() | 否 | 当前行在其分组内的序号.不管其排序结果中是否出现重复值.其排序结果都为:1,2.3.4.5. |
DENSE_RANK() | 否 | 不间断的组内排序.使用这个函数时,可以出现1.1.2.2这种形式的分组。 |
RAN() | 否 | 间断的组内排序。其排序结果可能出现如下结果:1.1.3.4.4.6 |
PERCENT_RANK() | 否 | 累计百分比。该函数的计算结果为:小于该条记录值的所有记录的行数/该分组的总行数-1.所以该记录的返回值为[0,1]。 |
CUME_DIST() | 否 | 累计分布值。即分组值小于等于当前值的行数与分组总行数的比值。取值范围为(0.1]。 |
LAG() | lag(expr,[N,[detaut]]) | 从当前行开始往前取第N行,如果N缺失,默认为1。如果不存在前一行.则默认返回default。default默认值为NULL。 |
LEAD() | lead(expr,[N,[defaut]]) | 从当前行开始往后取第N行。函数功能与lag()相反.其余与lag()相同。 |
FIRST_VALUE() | frst_value(expr) | 返回分组内截止当前行的第一个值。 |
LAST_VALUE() | last_value(expr) | 返回分组内截止当前行的最后一个值。 |
NTH_VALUE() | nth_value(expr.N) | 返回分组内截止当前行的第N行。与first_value\last_value\nth_ value函数功能相似,只是返回分组内截止当前行的不同行号的数据。 |
NTILE() | ntile(N) |
返回当前行在分组内的分桶号。在计算时要先将该分组内的所有数据划分成N个桶。之后返回每个记录所在的分桶号。返回范围从1到N。 |
注:‘参数’列说明该函数是否可以加参数。“否”说明该函数的括号内不可以加参数。expr即可以代表字段,也可以代表在字段上的计算,比如sum(col)等。
将上述函数按照功能划分,可以把MySQL支持的窗口函数分为如下几类:
- 序号函数:ROW_NUMBER()、RANK()、DENSE_RANK()
- 分布函数:PERCENT_RANK()、CUME_DIST()
- 前后函数:LAG()、LEAD()
- 头尾函数:FIRST_VALUE()、LAST_VALUE()
- 其它函数:NTH_VALUE()、NTILE()
序号函数:
ROW_NUMBER():顺序排序——1、2、3,
RANK():并列排序,跳过重复序号——1、1、3,
DENSE_RANK():并列排序,不跳过重复序号——1、1、2。
分布函数:
每行按照公式(rank-1) / (rows-1)进行计算。其中,rank为RANK()函数产生的序号,rows为当前窗口的记录总行数。
LAG和LEAD分析函数可以在同一次查询中取出同一字段的前N行的数据(LAG)和后N行的数据(LEAD)作为独立的列。
NTH_VALUE(expr, n):
其中NTH_VALUE(expr, n)中的第二个参数是指这个函数取排名第几的记录,返回窗口中第n个expr的值。
NTILE(n)函数:
将分区中的有序数据分为n个等级,记录等级数。
4、窗口函数的使用
窗口函数的语法
window_function(expr)
OVER( partition by ……
order by ……
frame_clause ……
)
如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,窗口函数基于所有行进行计算;如果不为空,则有三个参数来设置窗口:
- partition by子句:按照指定字段进行分区,两个分区由边界分隔,窗口函数在不同的分区内分别执行,在跨越分区边界时重新初始化。
- order by子句:按照指定字段进行排序,窗口函数将按照排序后的记录顺序进行编号。可以和partition by子句配合使用,也可以单独使用。
- frame子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。
5、示例代码
聚合函数也可以作为窗口函数(聚合函数VS窗口函数)
上述是聚合函数sum()作为窗口函数的例子,类似地avg、mean、max、min等聚合函数也可以作为窗口函数使用。
常见窗口函数的使用
row_number()
first_value()、lead()
sum()
avg()
给窗口指定别名
MySQL之窗口函数相关推荐
- 不好意思,我真的不知道MySQL的窗口函数...
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:推荐 8 个常用 Spring Boot 项目个人原创+1博客:点击前往,查看更多 来源:知乎 转自:大数据分析 ...
- MySQL - SQL窗口函数
1.应用场景 窗口函数解决的问题包括: 1)排名问题 2)top N问题 应用工作中, 面试中. 2.学习/操作 前言 MySQL版本8已支持窗口函数这个功能, 如果低于该版本, 会出现SQL报错! ...
- MySQL六种窗口函数用法案例
Java和大数据系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等 ...
- 2021-11-07大数据学习日志——MySQL进阶——窗口函数
01_窗口函数概述 学习目标 了解窗口函数的优点 1.1 窗口函数 接下来的课程中我们来介绍窗口函数window functions. MYSQL 8.0 之后,加入了窗口函数功能,简化了数据分析工作 ...
- mysql窗口函数_MySQL8.0窗口函数入门实践及总结
前言 MySQL8.0之前,做数据排名统计等相当痛苦,因为没有像Oracle.SQL SERVER .PostgreSQL等其他数据库那样的窗口函数.但随着MySQL8.0中新增了窗口函数之后,针对这 ...
- HIVE:窗口函数,用sql语句查询MySQL安装路径和版本
数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...
- 窗口分析函数19_Mysql查询窗口函数里第一个 最后一个 第N个元素的值的案例详解(FIRST_VALUE LAST_VALUE NVH_VALUE)
Mysql查询窗口函数之按序号取元素详解 需求概述 查询以课程(course)分区以分数(score)逆序的窗口里的第一个.最后一个和第2个元素对应的值.示例表数据见下: SELECT '数学' co ...
- 堪比培训机构的MySQL系列博客
这个blog,我整理了我之前写的MySQL开发系列和MySQL运维系列,知识丰富程度堪比培训机构 个人能力有限,如有错误的地方,欢迎指正. 文章目录 一.MySQL开发系列 1.1 MySQL 行转列 ...
- 窗口函数(Window Function)
文章目录 窗口函数概述 窗口函数和聚合函数的区别 使用要点 应用场景 语法结构 非聚合窗口函数 rank dense_rank row_number cume_dist percent_rank fi ...
最新文章
- LINQ篇:ASP.NET using LINQ(Part One) Scott大师的产物
- 已解决:k8s集群启动后,默认创建哪些namespace?
- C语言 __LINE__ - C语言零基础入门教程
- 导入要素到要素类(C++)ArcEngine开发
- pycharm的markdown文件编写
- IMAP协议与imbox第三方库读取所有邮件
- sqlserver恢复已经删除的表记录
- python分号怎么用_go、java已经python中分号的使用
- 期待只在最美的时光遇见你
- MySQL从入门到精通之sql语言---(9月2日更新)
- TQ2440开发板学习纪实(4)--- 初始化片外RAM,让程序有更大内存空间
- 微信小程序appid的修改方法
- python渗透攻击
- 毕业旅行 | 伦敦5日游行程推荐
- 北大学霸隐居20年,王青松花光350万后,如今怎么样了?
- 强化学习——初探强化学习
- python画羊_python编程羊车门问题代码示例
- 打印机一直不停打乱码的解决方法
- EasyExcel读写Excel
- 低速接口之SPI接口,分类,四种模式,特点
热门文章
- 泛读:基于机器学习的雷达辐射源识别方法综述
- 引用类型和原始类型区别
- 手撕伪鸡汤,人事部门经理给你的八个职场忠告
- 【大学物理实验】刚体转动定律的研究
- HTML+CSS+JS计——仿苏苏超市(1页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- 南亚风情第壹城非遗文化节,一站式休闲首选之地
- 孪生素数100java_java实现孪生素数
- 股权转让项目:昆明市粮油贸易中心有限责任公司13.56497%股权转让
- c++中的引用,默认参数,占位参数
- WIndows安装vim