SQL面试题更新 2026-08-03

在 SQL 查询中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 这三种窗口函数在返回排名结果上有什么不同?请具体说明它们各自的行为特征和适用场景。

考察说明

考查对 SQL 窗口函数中排名函数差异的理解,以及能否准确区分并应用于实际查询。

回答思路

  1. 【回答框架 1】ROW_NUMBER() 会为每一行分配一个唯一的连续整数,从 1 开始,即使有相同排序值,也会按顺序(不确定)分配不同序号,适合生成行号或分页。
  2. 【回答框架 2】RANK() 和 DENSE_RANK() 对于相同排序值会分配相同排名,但后续排名处理不同:RANK() 会留下空洞,例如 1,1,3;DENSE_RANK() 则连续,例如 1,1,2。
  3. 【回答框架 3】RANK() 适合需要严格名次间隔的排名场景,比如比赛名次;DENSE_RANK() 适合需要紧凑排名的场景,比如排行榜,不希望因并列导致名次跳跃。
  4. 【回答框架 4】在实际使用中,需要配合 PARTITION BY 和 ORDER BY 子句来限定分组和排序依据;三者都需要在窗口函数上下文中使用。
  5. 【关键点 1】ROW_NUMBER() 总是返回唯一且连续的序号。
  6. 【关键点 2】RANK() 对于并列值赋予相同排名,并跳过后续排名(留下空洞)。
  7. 【关键点 3】DENSE_RANK() 对于并列值赋予相同排名,但不跳过后续排名(连续)。
  8. 【关键点 4】三者都基于 ORDER BY 子句确定排序,可以配合 PARTITION BY 进行分组排名。
  9. 【易错点 1】不要混淆 RANK() 和 DENSE_RANK() 的排名规则,注意间隙差异。
  10. 【易错点 2】ROW_NUMBER() 在并列值时的具体顺序可能不稳定,除非 ORDER BY 包含足够列来唯一确定顺序。
  11. 【易错点 3】窗口函数不能直接用于 WHERE 子句,需要通过子查询或 CTE 进行过滤。