1 MYSQL8窗口函数
窗口函数与聚合函数很像,他们都是在一组记录而不是整张表上执行的。但是,一个聚合函数在一组记录执行后只返回一条结果而窗口函却会对改分组内的每行记录都返回一个结果。
函数名 参数 描述
cume_dist() 否 累计分布值。即分组值小于等于当前值的行数与分组总行数的比值。取值范围为(0,1]。
dense_rank() 否 不间断的组内排序。使用这个函数时,可以出现1,1,2,2这种形式的分组。
first_value() 是;first_value(expr) 返回分组内截止当前行的第一个值。
lag() 是;lag(expr,[N,[default]]) 从当前行开始往前取第N行,如果N缺失默认为1。若没有没有,则默认返回default。default默认值为NULL
last_value() 是;last_value(expr) 返回分组内截止当前行的最后一个值。
lead() 是;lead(expr,[N,[default]]) 从当前行开始往后取第N行。函数功能与lag()相反,其余与lag()相同。
nth_value() 是;nth_value(expr,N) 返回分组内截止当前行的第N行。first_value\last_value\nth_value函数功能相似,只是返回分组内截止当前行的不同行号的数据。
ntile() 是;ntile(N) 返回当前行在分组内的分桶号。在计算时要先将改分组内的所有数据划分成N个桶,之后返回每个记录所在的分桶号。返回范围从1到N
percent_rank() 否 累计百分比。该函数的计算结果为:小于该条记录值的所有记录的行数/该分组的总行数-1. 所以改记录的返回值为[0,1]
rank() 否 间断的组内排序。其排序结果可能出现如下结果:1,1,3,4,4,6
row_number() 否 当前行在其分组内的序号。不管其排序结果中是否出现重复值,其排序结果都为:1,2,3,4,5
over子句
over子句可以指定如何将记录划分分区以供窗口函数处理。如果over()为空,则是将整个查询记录作为一个分组。如果over子句不为空,则其可以指定查询记录划分分组的方式以及记录在分组内部的排序方式。除此之外,over子句也可以和聚合函数一起用