窗口函数:rank,dense_rank,row_number 使用上的区别

窗口函数:rank,dense_rank,row_number 使用上的区别
最新回答
薄荷凉我心

2023-03-12 21:52:23

窗口函数:rank, dense_rank, row_number 使用上的区别

在SQL中,窗口函数(Window Functions)用于对一组行执行计算,并将计算结果作为新列返回,而不会改变原始数据集的行数。其中,rank、dense_rank 和 row_number 是三种常用的窗口函数,它们在处理排序和排名时具有不同的行为。

1. row_number
  • 功能:为每一行分配一个唯一的序号,序号是根据指定的排序顺序生成的。
  • 特点:无论是否有重复值,row_number 都会为每一行分配一个不同的序号。
  • 适用场景:当需要为每一行生成一个唯一的、基于排序顺序的序号时,可以使用 row_number。

例如,在以下数据集中:

使用 row_number 对“分数”列进行排序,结果如下:

  • 行1:row_number = 1(分数最高)
  • 行2:row_number = 2
  • 行3:row_number = 3
  • ...

每一行都会有一个唯一的序号,即使两行具有相同的分数。

2. rank
  • 功能:为每一行分配一个排名,排名是根据指定的排序顺序生成的,但如果有重复值,则这些重复值会共享相同的排名。
  • 特点:在出现重复值时,rank 会跳过下一个序号。例如,如果有两个并列第一,则下一个排名将是第三,而不是第二。
  • 适用场景:当需要基于排序顺序生成排名,并且希望在有重复值时跳过下一个序号时,可以使用 rank。

在相同的数据集中,使用 rank 对“分数”列进行排序,结果可能如下:

  • 行1和行2:rank = 1(分数相同)
  • 行3:rank = 3(因为跳过了第二名)
  • ...

如果有两个并列第一,则下一个排名将是第三。

3. dense_rank
  • 功能:为每一行分配一个排名,排名是根据指定的排序顺序生成的,但如果有重复值,则这些重复值会共享相同的排名,并且不会跳过下一个序号。
  • 特点:在出现重复值时,dense_rank 会继续按自然数增长赋予序号。例如,如果有两个并列第一,则下一个排名将是第二。
  • 适用场景:当需要基于排序顺序生成排名,并且希望在有重复值时保持序号连续时,可以使用 dense_rank。

在相同的数据集中,使用 dense_rank 对“分数”列进行排序,结果可能如下:

  • 行1和行2:dense_rank = 1(分数相同)
  • 行3:dense_rank = 2(不会跳过第二名)
  • ...

如果有两个并列第一,则下一个排名将是第二。

即使出现相同值,dense_rank 也是按照自然增长的序列号排名,不会出现同分不同名的情况。

总结
  • row_number:为每一行分配一个唯一的序号,不考虑重复值。
  • rank:为每一行分配一个排名,考虑重复值,但会跳过下一个序号。
  • dense_rank:为每一行分配一个排名,考虑重复值,但不会跳过下一个序号。

在选择使用哪种窗口函数时,应根据具体需求和数据特点来决定。