简介
在 MySQL8.0.2 的升级中,引入了一个新特性,就是窗口函数的支持。对于查询中的每一行,使用与该行相关的行执行计算。其中包括 RANK()、LAG() 和 NTILE() 等函数。此外,现在大多数现有的聚合函数都可以用作窗口函数;例如,SUM() 和 AVG()。
本次我们简单了解下 RANK()、DENSE_RANK() 和 ROW_NUMBER() 三个和排名计算有关系的函数。
- RANK() 当前行在其分区内的排名,有间隔。
- DENSE_RANK() 当前行在其分区内的排名,无间隔。
- ROW_NUMBER() 其分区内的当前行数。
测试数据
准备10条测试数据,id 从10001到10010,以下的查询测试按照 likes (点赞数) 字段进行排名计算,点赞数越多,排名越靠前。
查询示例
SELECT
w.id,
w.likes,
RANK() OVER ( ORDER BY w.likes DESC ) AS `rank`,
DENSE_RANK() OVER ( ORDER BY w.likes DESC ) AS `dense_rank`,
ROW_NUMBER() OVER ( ORDER BY w.likes DESC ) AS `row_number`
FROM
video_works w
结果对比
ROW_NUMBER() 比较简单直接,只返回了行号,即便是相同的点赞数也会有不同的排名。
在 RANK() 和 DENSE_RANK() 中,相同的点赞数会对应相同的排名,不同点就是在排名间隔的处理上。如果出现并列第二的情况,那么第四行数据的排名,在 RANK() 中会返回 4,在 DENSE_RANK() 中会返回 3 。我们可以根据实际需要,来选择合适的函数进行排名计算。