简述row_number,rank,dense_rank的区别 ?
参考回答
ROW_NUMBER()、RANK()和DENSE_RANK()是Hive中常用的开窗函数,用于为查询结果集中的每一行分配一个排名。它们的主要区别在于如何处理排名相同的行:
- ROW_NUMBER():
- 为查询结果集中的每一行分配唯一的行号,即使数据相同,也会分配不同的行号。
- 排名不受相同数据的影响,始终按顺序递增。
- RANK():
- 为查询结果集中的每一行分配排名,当数据相同的行会得到相同的排名,但接下来的排名会跳过。例如,若有两个排名为1的行,接下来的排名会是3。
- 这种跳跃性排名常用于处理数据中的并列项。
- DENSE_RANK():
- 与
RANK()类似,为查询结果集中的每一行分配排名,但不同的是,排名之间不会跳跃。即使有两行数据相同,下一行的排名也会紧接着前一行的排名。 - 适用于需要紧密排列的数据分析场景。
- 与
详细讲解与拓展
- 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的行号,不会出现重复的行号。
- 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
“`
- 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()为相同的数据分配相同的排名,并且后续排名没有跳跃,紧接着分配。