58同城大数据面试题及参考答案
ROW_NUMBER、RANK、DENSE_RANK 函数的区别是什么?
这三个函数均为窗口函数,用于为结果集分区中的行生成序号,但核心逻辑存在显著差异,具体表现如下:
数据分布与排序规则
假设存在分区内分数数据为 [90, 85, 85, 80]
,按分数降序排序:
- ROW_NUMBER:为分区内每行分配唯一序号,即使值相同也不重复。上述数据的序号为
1, 2, 3, 4
。 - RANK:相同值分配相同序号,后续序号跳过重复值的数量。上述数据的序号为
1, 2, 2, 4
(两个 85 分同为第 2 名,下一名直接为第 4 名)。 - DENSE_RANK:相同值分配相同序号,后续序号连续递增。上述数据的序号为
1, 2, 2, 3
(两个 85 分同为第 2 名,下一名为第 3 名)。
适用场景
- ROW_NUMBER:常用于强制去重或分页场景,例如从每个班级中