在SQL中,RANK和DENSE_RANK都用于根据指定标准为结果集中每个行分配排名值,通常使用ORDER BY子句。两者之间的主要区别在于它们如何处理平局,即当两行或多行在排名顺序中具有相同值时的情况。RANK为每个不同的值分配一个唯一的排名号码,这意味着如果出现平局,后续的排名号码将相应地跳过。相反,DENSE_RANK在分配排名时不会有间隔;如果出现平局,下一个排名号码将是下一个连续的整数。
例如,考虑一个简单的员工薪资数据集:
员工 | 薪资 |
---|---|
爱丽丝 | 5000 |
鲍勃 | 5000 |
查理 | 6000 |
大卫 | 7000 |
当应用RANK时,查询可能如下所示:
SELECT Employee, Salary, RANK() OVER (ORDER BY Salary DESC) AS Rank
FROM Employees;
结果将是:
员工 | 薪资 | 排名 |
---|---|---|
大卫 | 7000 | 1 |
查理 | 6000 | 2 |
爱丽丝 | 5000 | 3 |
鲍勃 | 5000 | 3 |
在这里,爱丽丝和鲍勃的薪资相同,均获得排名3。下一个可用的排名将是4,而大卫则跳过了这个数字,导致间隔。
现在考虑将DENSE_RANK应用于相同的数据:
SELECT Employee, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) AS DenseRank
FROM Employees;
结果将是:
员工 | 薪资 | 密集排名 |
---|---|---|
大卫 | 7000 | 1 |
查理 | 6000 | 2 |
爱丽丝 | 5000 | 3 |
鲍勃 | 5000 | 3 |
在这种情况下,爱丽丝和鲍勃仍然共享相同的排名,但跟随他们平局排名的下一个排名是3,而不是跳到4。这个差异对于理解SQL中的排名是至关重要的,并且在报告和数据分析中,当准确的排名顺序很重要时,可能会产生影响。