简述row_number,rank,dense_rank的区别 ?

参考回答

ROW_NUMBER()RANK()DENSE_RANK()是Hive中常用的开窗函数,用于为查询结果集中的每一行分配一个排名。它们的主要区别在于如何处理排名相同的行:

  1. ROW_NUMBER()
    • 为查询结果集中的每一行分配唯一的行号,即使数据相同,也会分配不同的行号。
    • 排名不受相同数据的影响,始终按顺序递增。
  2. RANK()
    • 为查询结果集中的每一行分配排名,当数据相同的行会得到相同的排名,但接下来的排名会跳过。例如,若有两个排名为1的行,接下来的排名会是3。
    • 这种跳跃性排名常用于处理数据中的并列项。
  3. DENSE_RANK()
    • RANK()类似,为查询结果集中的每一行分配排名,但不同的是,排名之间不会跳跃。即使有两行数据相同,下一行的排名也会紧接着前一行的排名。
    • 适用于需要紧密排列的数据分析场景。

详细讲解与拓展

  1. ROW_NUMBER()
    • ROW_NUMBER()函数简单地为每一行分配一个唯一的编号。无论数据是否相同,它都会为每一行产生一个递增的行号。例如:
      SELECT order_id, order_amount,
          ROW_NUMBER() OVER (ORDER BY order_amount DESC) AS rank
      FROM orders;
      

      即使有两行订单金额相同,它们的行号仍然会按顺序递增。

  • 示例:如果有五笔订单金额相同,ROW_NUMBER()会为每一笔订单分配1到5的行号,不会出现重复的行号。
  1. RANK()
    • RANK()函数在处理相同数据时会为它们分配相同的排名,但接下来的排名会跳过。例如:
      SELECT order_id, order_amount,
          RANK() OVER (ORDER BY order_amount DESC) AS rank
      FROM orders;
      

      如果有两个订单金额相同,排名会是1,接下来的排名会是3,而不是2。

  • 示例:假设有五笔订单金额:100, 200, 200, 150, 150,RANK()会为它们分配如下排名:

    “`
    200 -> Rank 1
    200 -> Rank 1
    150 -> Rank 3
    150 -> Rank 3
    100 -> Rank 5
    “`

  1. DENSE_RANK()
    • DENSE_RANK()也为相同数据分配相同的排名,但不会跳跃。即便有相同排名的行,下一行的排名会是紧接着的数字。
      SELECT order_id, order_amount,
          DENSE_RANK() OVER (ORDER BY order_amount DESC) AS rank
      FROM orders;
      

      如果有两个订单金额相同,排名会是1,接下来的排名会是2,而不是跳到3。

  • 示例:对于同样的数据集(100, 200, 200, 150, 150),DENSE_RANK()会为它们分配如下排名:

    “`
    200 -> Rank 1
    200 -> Rank 1
    150 -> Rank 2
    150 -> Rank 2
    100 -> Rank 3
    “`

总结

  • ROW_NUMBER()为每一行分配一个唯一的编号,无论数据是否相同。
  • RANK()为相同的数据分配相同的排名,并且后面的排名会跳跃。
  • DENSE_RANK()为相同的数据分配相同的排名,并且后续排名没有跳跃,紧接着分配。

发表评论

后才能评论