MySQL窗口函数(二)

198 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

窗口函数

**1.分布函数 **

1. percent_rank

percent_rank: 计算方式:(rank-1) / (rows -1)其实就等价于(当前行的排序id - 1)/ (当前组总行数 - 1) 百分比函数,返回分区值小于当前行中的值的百分比,说人话就是对于每组的sort_id,比当前行的sort_id小的占比,比如1,2,3,4,5假设当前行的sort_id是3 。

执行如下SQL:

image.png 根据上述公式(3 - 1)/ (5 - 1),则小于当前行的占比为0.5,执行结果如下图:

image.png

2. cume_dist

cume_dist累计分布值,小于对于当前sort_id的行数 / 当前分组的总行数。 执行如下SQL:

image.png

执行结果如下:

image.png

如图所示红框内第一条的排序r为1,那么小于等于1的只有他自己 根据公式可得 1 / 5 = 0.2。

**2.前后函数 **

1. lag

lag(expr,n) 返回当前行前第n行的字段值/表达式。

返回当前行前一行的dept_id,执行如下SQL:

image.png

可以看到当前数据的pre_dept_id的值为上一条的dept_id执行结果如下图:

image.png

表达式类型,返回的dept_id在后面拼接掘金,执行如下SQL:

image.png

可以看到数据的pre_dept_id的值在最后都追加了掘金,执行结果如下图:

image.png

2. lead

lead(expr,n) 返回当前行后第n行的字段值。

返回当前行前一行的dept_id,执行如下SQL:

image.png

执行结果如下图:

image.png

**3.首尾函数 **

1. first_value

first_value(expr) 返回当前分组第一个值。

执行如下sql: image.png

执行结果如下:

image.png

2. last_value

last_value(expr) 返回当前分组最后一个值。 执行如下SQL:

image.png

执行结果如下:

image.png

这两个函数是相反的,实际工作还是比较常用。

**4.其他函数 **

1. nth_value

nth_value(expr,n) 返回第n个expr的值,以分组开始向下取n,和lag、lead不同的是他们是以自身为起始,而nth以每组第一个为起始。

执行如下sql:

image.png

执行结果如下:

image.png

2. ntile

ntile(n) 将每组分组数据在进行分组,并且记录桶编号。

执行如下SQL:

image.png

执行结果如下:

image.png 概念可能不好理解,但是能看结果图,实际上就是把已经分组完成的数据在进行分批,分多少批次和n有关。

最后补出官网对窗口函数的作用图:

image.png