在 MySQL 中,可以使用 ROW_NUMBER()
、 RANK()
和 DENSE_RANK()
函数,它们都可以用于实现类似的功能,但又有一些区别。
假设有一个名为 your_table
的表,包含 id
、name
和 score
列。以下是对这三个函数的比较:
一、ROW_NUMBER()
函数
- 用法:
ROW_NUMBER() OVER (PARTITION BY <分组列> ORDER BY <排序列>) AS <别名>
。 - 特点:为结果集的每一行分配一个唯一的连续整数序号,序号从 1 开始,无论是否有相同的值,序号都是连续递增的。
- 示例:
SELECT *, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM your_table;
二、RANK()
函数
- 用法:
RANK() OVER (PARTITION BY <分组列> ORDER BY <排序列>) AS <别名>
。 - 特点:为结果集的每一行分配一个序号,当出现相同的值时,它们会共享相同的序号,并且下一个序号会跳过相应的数量。例如,如果有两个行具有相同的排名值,下一个排名值将是当前排名值加上相同排名的行数。
- 示例:
SELECT *, RANK() OVER (ORDER BY score DESC) AS rank_num
FROM your_table;
三、DENSE_RANK()
函数
- 用法:
DENSE_RANK() OVER (PARTITION BY <分组列> ORDER BY <排序列>) AS <别名>
。 - 特点:为结果集的每一行分配一个序号,当出现相同的值时,它们会共享相同的序号,但下一个序号不会跳过任何数量。序号是连续的,不会出现间隙。
- 示例:
SELECT *, DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_num
FROM your_table;