MySQL8.0窗⼝函数之排名函数(row_number、rank、
dense_rank)
MySQL从8.0开始⽀持开窗函数,这个功能在别的数据库中早已⽀持,更加⽅便分析,开窗函数也是通过指定字段将数据分成多个窗⼝,对每个窗⼝每⼀⾏执⾏函数,每个窗⼝返回等⾏数的结果。
窗⼝函数和普通聚合函数也很容易混淆,⼆者区别如下:
1、聚合函数是将多条记录聚合为⼀条;⽽窗⼝函数是每条记录都会执⾏,有⼏条记录执⾏完还是⼏条。
2、聚合函数也可以⽤于窗⼝函数中。
窗⼝函数分为静态窗⼝和滑动窗⼝,静态窗⼝的⼤⼩是固定的,滑动窗⼝的⼤⼩可以根据设置进⾏变化,在当前窗⼝下⽣成⼦窗⼝。
语法:函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range between 起始位置 and 结束位置)
rank函数怎么排名⼀、row_number() over(partition by sid order by score desc)
没有重复值的排序[记录相等也是不重复的]可以进⾏分页使⽤。
partition by⼦句指⽰如何将查询⾏划分为组。给定⾏的窗⼝函数结果基于包含该⾏的分区的⾏。如果partition by省略,则存在由所有查询⾏组成的单个分区。order by ⼦句指⽰如何对每个分区中的⾏进⾏排序。根据order by ⼦句相等的分区⾏被视为对等。如果 order by 省略,则分区⾏是⽆序的,没有隐含的处理顺序,并且所有分区⾏都是对等的。
⼆、rank:跳跃排序。
返回其分区中当前⾏的排名,带有间隙。同⾏被视为关系,并获得相同的排名。如果存在⼤于1的组,则此函数不会将连续的等级分配给对等组; 结果是不连续的排名数字。
应该使⽤此函数将order by 分区⾏排序为所需的顺序。没有order by ,所有⾏都是对等的。
三、dense_rank:连续排序。
返回其分区中当前⾏的排名,没有间隙。同⾏被视为关系,并获得相同的排名。此功能将连续的等级分配给对等组; 结果是,⼤于1的组不会产⽣不连续的等级数。
应该使⽤此函数将order by 分区⾏排序为所需的顺序。没有order by ,所有⾏都是对等的。
还有头尾函数、前后函数、分布函数、其他函数,下次再更新。