MySQL8.0窗口函数之排名函数(row_number、rank、dense_rank)

MySQL从8.0开始支持开窗函数,这个功能在别的数据库中早已支持,更加方便分析,开窗函数也是通过指定字段将数据分成多个窗口,对每个窗口每一行执行函数,每个窗口返回等行数的结果。

窗口函数和普通聚合函数也很容易混淆,二者区别如下:

 1、聚合函数是将多条记录聚合为一条;而窗口函数是每条记录都会执行,有几条记录执行完还是几条。

 2、聚合函数也可以用于窗口函数中。

窗口函数分为静态窗口和滑动窗口,静态窗口的大小是固定的,滑动窗口的大小可以根据设置进行变化,在当前窗口下生成子窗口。

语法:函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range between 起始位置 and 结束位置)

一、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 ,所有行都是对等的。

 

还有头尾函数、前后函数、分布函数、其他函数,下次再更新。

posted @ 2020-09-17 11:23  Lyx1001  阅读(589)  评论(0编辑  收藏  举报