SQL 面试必考题:Rank() ,row_number(), dense_rank()

SQL 面试必考题:Rank() ,row_number(), dense_rank()
最新回答
咱葙亲祛

2026-04-10 22:20:01

在SQL面试中,RANK()、ROW_NUMBER()和DENSE_RANK()是三个常用的窗口函数,用于对数据进行排序和排名。以下是对这三个函数的详细解释和比较:

  • ROW_NUMBER():

    为每一行分配一个唯一的序号,从1开始。

    即使排序列的值相同,每一行也会得到不同的序号。

    示例:

    SELECT v, ROW_NUMBER() OVER (ORDER BY v) row_numberFROM test_test ORDER BY v;
  • RANK():

    为数据行进行排名,如果排序列的值相同,则这些行会得到相同的排名。

    后续的排名会跳过相同的排名数。例如,如果有两个并列第1名,则下一个排名是第3名。

    示例:

    SELECT v, RANK() OVER (ORDER BY v) rankFROM test_test ORDER BY v;

  • DENSE_RANK():

    同样为数据行进行排名,且相同值的行会得到相同的排名。

    与RANK()不同的是,DENSE_RANK()不会跳过任何排名,即排名是连续的。例如,两个并列第1名后,下一个排名是第2名。

    示例:

    SELECT v, DENSE_RANK() OVER (ORDER BY v) dense_rankFROM test_test ORDER BY v;

这三个函数都可以与PARTITION BY子句结合使用,以在每个分区内独立进行排名。例如,以下查询展示了如何在每个部门内根据薪资进行排名:

SELECT empno, deptno, sal, RANK() OVER(PARTITION BY deptno ORDER BY sal) rnFROM emp;

总结:

  • ROW_NUMBER()为每行分配唯一序号,不考虑值是否相同。
  • RANK()为相同值的行分配相同排名,但后续排名会跳过相同排名数。
  • DENSE_RANK()同样为相同值的行分配相同排名,但排名是连续的,不会跳过任何排名。

在实际应用中,根据具体需求选择合适的排名函数。如果需要唯一序号,使用ROW_NUMBER();如果需要处理并列排名且允许排名跳跃,使用RANK();如果需要处理并列排名且要求排名连续,使用DENSE_RANK()。