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()。