深入解析MySQL的窗口函数
对一个成熟的数据分析师来说,窗口函数可以大幅提高查询效率,且SQL代码优雅。
一、定义
窗口可以理解为记录集合,窗口函数就是在满足某种条件的记录集合上执行的特殊函数。 即:应用在窗口内的函数。
静态窗口:每条记录都要在此窗口内执行函数,窗口大小都是固定的。
动态窗口:不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。
二、语法格式
over()括号内若不写,则意味着窗口函数基于满足where条件的所有行进行计算。
若括号内不为空,则支持以下语法来设置窗口。
数据范围:
三、分类
1、聚合类
聚合窗口函数与普通聚合函数的区别:
普通场景下的聚合函数是将多条记录聚合为一条**(多到一);**窗口函数是每条记录都会执行,有几条记录执行完还是几条**(多到多)**。接下来通过解决具体需求来让大家更加了解窗口函数的用法,希望大家阅读完能动手练习。 先创建user_trade表:
从navicat中导入以下数据源:
user_trade数据源:https://gitee.com/hu-weiqing/datasource/blob/master/user_trade.xlsx
数据随机展示10条如下:
累计求和:sum()over()
需求1运行结果(部分)
需求2运行结果(部分)
移动平均:avg() over()
需求3运行结果(部分)
最大/最小值:max()/min() over()
需求4运行结果(部分)
2、排序类
row_number()、rank() 和dense_rank()
需求5运行结果(部分)
row_number()、rank() 和dense_rank() 三种排序函数的区别:
row_number:每一行记录生成一个序号,依次排序且不会重复。 12345…
rank:跳跃排序,生成的序号有可能不连续。11345…
dense_rank:在生成序号时是连续的。11234…
ntile(n)over()
ntile(n)用于将分组数据按照顺序切分成n片,返回当前切片值. n表示切片的数量; 不支持rows between
需求6运行结果(部分)
需求7运行结果(部分)
3、偏移分析函数
lag() over()向上偏移
lag(exp_str,offset,defval) exp_str:字段名 offset:偏移量 defval:默认值。当向上偏移了offset行已经超出了表的范围时,lag()函数将defval这个参数值作为函数的返回值,若没有指定默认值,则返回NULL。
需求8运行结果
lead() over()向下偏移
用法同lag()over()函数。
补充练习:
需求10运行结果
窗口函数在数据分析师的工作中应用非常广,如果不会窗口函数,很可能同样的需求用普通表关联写需要关联很多张表,导致性能不好,查询速度非常慢。
到此这篇关于深入解析MySQL的窗口函数的文章就介绍到这了,更多相关MySQL窗口函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
栏目分类
- Big Time中文网
- Big Time中文网
你的位置:FWC中文网 > Big Time中文网 > 深入解析MySQL的窗口函数