MySQL窗口函数

Mysql窗口函数

跟拉钩数据分析训练营一起学习窗口函数
在输出结果方面:窗口函数本身也有分组与group by分组最显著的不同是窗口函数输入计算的有多少行数据,输出的也有多少行,不会像group by那样进行聚合。


窗口函数结构:

***函数名([expr]) over(partition by <要分列的组> order by <要排序的列> rows between <数据范围>)***

其中,over是关键字,用来指定函数执行的窗口范围,包含三个分析子句:分组(partition by)子句,排序(order by)子句,窗口(rows)子句,如果后面括号中什么都不写,则意味着窗口包含满 足where条件的所有行,窗口函数基于所有行进行计算。


窗口函数内部解读:

窗口函数(专有窗口函数+聚合类窗口函数)和普通场景下的聚合函数也很容易混淆,二者区别 如下:

普通场景下的聚合函数是将多条记录聚合为一条(多到一);窗口函数是每条记录都会执行,有几条记录执行完还是几条(多到多)。 分组(partition by):记录按照字段进行分组,窗口函数在不同的分组上分别执行。
分组(partition by):记录按照字段进行分组,窗口函数在不同的分组上分别执行。
排序(order by):按照哪些字段进行排序,窗口函数将按照排序后的记录顺序进行编号,可 以和partition子句配合使用,也可以单独使用。如果没有partition子句,数据范围则是整 个表的数据行。
窗口(rows):就是进行函数分析时要处理的数据范围,属于当前分区的一个子集,通常用来 作为滑动窗口使用。比如要根据每个订单动态计算包括本订单和按时间顺序前后两个订单 的移动平均支付金额,则可以设置rows子句来创建滑动窗口(rows)。

几个常用的窗口函数:

  1. 排序

row_number其实算不上排序,只是给了一个行号。

row_number() over() --顾名思义 行号

rank() over() --排序,那种1111,4那种

dense_rank() over() --排序,112233334这种 就是排序名没有间隔

**substr()、substring()**函数,都是截取函数。

2. 分类、切成几片

ntile(n) over(partition by …A… order by …B… )

n:切分的片数

A:分组的字段名称 B:排序的字段名称 ntile(n),用于将分组数据按照顺序切分成n片,返回当前切片值 NTILE不支持ROWS BETWEEN。

3.偏移函数

Lag和Lead函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead) 作为 独立的列。 在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就显得尤为重要。
lag(exp_str,offset,defval) over(partion by …order by …) lead(exp_str,offset,defval) over(partion by …order by …)
exp_str是字段名称。 offset是偏移量,即是上1个或上N个的值,假设当前行在表中排在第5 行,则offset 为3,则表示我 们所要找的数据行就是表中的第2行(即5-3=2)。offset默认值为1。 defval默认值,当两个函数取上N/下N个值,当在表中从当前行位置向前数N行已经超出了表的 范 围时,lag()函数将defval这个参数值作为函数的返回值,若没有指定默认值,则返回NULL, 那么 在数学运算中,总要给一个默认值才不会出错。

例子

全年累计销售额就是窗口函数输出的结果,有多少行就会,算多少结果,一行一行的,一个窗口一个窗口的算。
第三列全年累计销售额就是窗口函数输出的结果,初始数据有多少行就会算出多少行的结果,一行一行的,一个窗口一个窗口的算。并不会像聚合函数一样聚合。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页