在 SQL 中,RANK
和 DENSE_RANK
都是窗口函数,用于为结果集中的行分配排名,但它们处理并列(重复值)的方式不同。关键区别在于,RANK
在出现并列后会跳过后续的排名数字,而 DENSE_RANK
则会保持连续的排名,没有间隙。这种区别影响了排名的计算和显示方式,尤其是在多行共享相同值的情况下。
RANK:并列后跳过排名 使用 RANK
时,如果两行或更多行具有相同的值(并列),它们将获得相同的排名。然而,下一个不同的值将被分配一个考虑到并列行数量的排名。例如,考虑一个考试成绩表:如果两个学生以 95 分并列第一名,他们都将获得 RANK = 1
。下一个最高分(例如 90 分)将跳过排名 2,并被分配 RANK = 3
。这会在排名序列中创建间隙。RANK
的语法是 RANK() OVER (ORDER BY column_name)
,其中 ORDER BY
子句定义了排名标准。当您需要反映行相对于所有其他行的位置,包括因并列引起的间隙时,这种行为很有用。
DENSE_RANK:排名无间隙 DENSE_RANK
也为并列的行分配相同的排名,但确保下一个不同的值紧随其后。使用相同的考试成绩示例,如果两个学生以 95 分并列排名 1,下一个 90 分将获得 DENSE_RANK = 2
(而不是 3)。排名保持连续,避免了间隙。DENSE_RANK
的语法与 RANK
类似:DENSE_RANK() OVER (ORDER BY column_name)
。当您希望排名代表没有间隙的层级或分组时,例如将员工分为“金”、“银”或“铜”绩效层级,其中编号的间隙无关紧要,此函数更佳。
何时使用哪个 当您需要反映确切的位置顺序,包括间隙时,请选择 RANK
(例如,跳过排名很重要的竞赛排名)。当连续排名比位置准确性更重要时,请使用 DENSE_RANK
(例如,分配优先级或将结果分组到无间隙的层级)。这两个函数都依赖于 ORDER BY
子句来确定排名逻辑,并且通常与 PARTITION BY
结合使用以将数据分段分组。理解它们的行为有助于确保在涉及并列值的情况下进行准确的报告和分析。