一起养成写作习惯!这是我参与「掘金日新计划 · 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:
根据上述公式(3 - 1)/ (5 - 1),则小于当前行的占比为0.5,执行结果如下图:
2. cume_dist
cume_dist累计分布值,小于对于当前sort_id的行数 / 当前分组的总行数。 执行如下SQL:
执行结果如下:
如图所示红框内第一条的排序r为1,那么小于等于1的只有他自己 根据公式可得 1 / 5 = 0.2。
**2.前后函数 **
1. lag
lag(expr,n) 返回当前行前第n行的字段值/表达式。
返回当前行前一行的dept_id,执行如下SQL:
可以看到当前数据的pre_dept_id的值为上一条的dept_id执行结果如下图:
表达式类型,返回的dept_id在后面拼接掘金,执行如下SQL:
可以看到数据的pre_dept_id的值在最后都追加了掘金,执行结果如下图:
2. lead
lead(expr,n) 返回当前行后第n行的字段值。
返回当前行前一行的dept_id,执行如下SQL:
执行结果如下图:
**3.首尾函数 **
1. first_value
first_value(expr) 返回当前分组第一个值。
执行如下sql:
执行结果如下:
2. last_value
last_value(expr) 返回当前分组最后一个值。 执行如下SQL:
执行结果如下:
这两个函数是相反的,实际工作还是比较常用。
**4.其他函数 **
1. nth_value
nth_value(expr,n) 返回第n个expr的值,以分组开始向下取n,和lag、lead不同的是他们是以自身为起始,而nth以每组第一个为起始。
执行如下sql:
执行结果如下:
2. ntile
ntile(n) 将每组分组数据在进行分组,并且记录桶编号。
执行如下SQL:
执行结果如下:
概念可能不好理解,但是能看结果图,实际上就是把已经分组完成的数据在进行分批,分多少批次和n有关。
最后补出官网对窗口函数的作用图: