简述row_number(),rank()和dense_rank()的区别 ?

参考回答

ROW_NUMBER()RANK()DENSE_RANK() 都是窗口函数,它们用于为查询结果集中的行分配一个唯一的排名。它们的区别主要体现在处理相同值时的排名方式:

  1. ROW_NUMBER():为每一行分配一个唯一的顺序编号,无论值是否相同。对于具有相同值的行,它们的排名是唯一的,且没有跳跃。
    • 示例
    SELECT value, ROW_NUMBER() OVER (ORDER BY value) FROM table_name;
    
  2. RANK():为查询结果集中的每一行分配排名。如果有多个相同值的行,它们会获得相同的排名,但排名会跳过。例如,如果两个行并列第2名,下一行的排名将是第4名。
    • 示例
    SELECT value, RANK() OVER (ORDER BY value) FROM table_name;
    
  3. DENSE_RANK():与 RANK() 类似,为查询结果集中的每一行分配排名。但是,DENSE_RANK() 在处理相同值时不会跳过排名。即使两行并列同一名次,下一行的排名仍然紧接在其后。
    • 示例
    SELECT value, DENSE_RANK() OVER (ORDER BY value) FROM table_name;
    

详细讲解与拓展

1. ROW_NUMBER()

  • 描述ROW_NUMBER() 给每一行分配一个唯一的编号。即使两行的值相同,它们的排名也不会相同,排名是严格按顺序递增的。
  • 特点:每一行都有唯一的编号,不会出现并列排名。

    例子
    假设我们有以下数据:

    “`text
    value
    </p></li>
    </ul>

    <hr />

    <p>10
    20
    20
    30

    “`
    运行 `ROW_NUMBER()` 时,输出将是:
    “`text
    value row_number
    —– ———–
    10 1
    20 2
    20 3
    30 4
    “`

    2. RANK()

    • 描述RANK() 会为相同的值分配相同的排名,但接下来的排名会跳过。例如,如果两个行并列第二,接下来的排名将是第四,而不是第三。
    • 特点:并列值有相同的排名,之后的排名会有间隔。

      例子
      使用相同的例子数据:

      “`text
      value
      </p></li>
      </ul>

      <hr />

      <p>10
      20
      20
      30

      “`
      运行 `RANK()` 时,输出将是:
      “`text
      value rank
      —– —-
      10 1
      20 2
      20 2
      30 4
      “`

      3. DENSE_RANK()

      • 描述DENSE_RANK() 类似于 RANK(),但在遇到相同值时,不会跳过排名。相同值的行会获得相同的排名,接下来的排名会紧接在其后。
      • 特点:并列值有相同的排名,但排名没有跳跃。

        例子
        同样的数据:

        “`text
        value
        </p></li>
        </ul>

        <hr />

        <p>10
        20
        20
        30

        “`
        运行 `DENSE_RANK()` 时,输出将是:
        “`text
        value dense_rank
        —– ———–
        10 1
        20 2
        20 2
        30 3
        “`

        总结

        • ROW_NUMBER():每行都有唯一的编号,不处理并列排名。
        • RANK():对并列的值给予相同的排名,接下来的排名会跳过。
        • DENSE_RANK():与 RANK() 类似,但不会跳过排名,紧接在并列排名后。

        选择哪种函数取决于排名的需求,是否需要处理并列情况以及排名是否需要连续。

发表评论

后才能评论