MySQL使用RANK窗口函数计算排名

本文介绍了MySQL8.0.2引入的窗口函数特性,重点讨论了RANK()、DENSE_RANK()和ROW_NUMBER()这三个与排名计算相关的函数。RANK()在遇到相同值时会有排名间隔,DENSE_RANK()则没有间隔,ROW_NUMBER()则为每行提供唯一的行号。通过示例展示了它们在处理点赞数排序时的区别,帮助选择适合的函数进行数据排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在 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 。我们可以根据实际需要,来选择合适的函数进行排名计算。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值