Hive的row_number()按PARTITIONBY分组和ORDERBY排序,为每组分配连续序号,常用于取每组前N条。排序值相同时序号随机,可改用rank()或dense_rank()。需注意性能,建议配合索引或分区。
在实际开发中,使用 Hive 的 row_number() 函数进行分组排序,是一项非常常见的需求。简单来说,row_number() 完全支持按分组独立排序,且实现起来十分直接。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
该函数的核心逻辑是:在每个分组内部,根据指定的排序规则,为每一行分配一个从 1 开始的连续序号。也就是说,同一个分组内的数据会单独排序,不同分组的序号互不干扰。这正是 row_number() 区别于其他窗口函数的最大特点。
直接看一个具体例子:
SELECT column1, column2,
row_number() OVER (
PARTITION BY column3
ORDER BY column4 DESC
) as row_num
FROM your_table;
这里的关键是 PARTITION BY column3:它指示 Hive 按照 column3 的值将数据切分成不同的组。紧接着的 ORDER BY column4 DESC 则指定每个分组内部的排序规则——升序或降序均可,完全由用户控制。最后,row_number() 在每个分组内,依据排序后的顺序依次编号,结果字段命名为 row_num。
应用场景非常丰富,例如取出每个部门薪资最高的员工、每类商品销量第一的记录,或者按时间分组后筛选出最早或最晚的几条数据——这些操作都离不开 row_number() 的分组排序能力。
PARTITION BY 指定的分组字段有重复值,这些重复值会进入同一个分组,排序编号会按顺序分配。ORDER BY 指定的排序字段存在相同值,row_number() 会随机分配序号(不保证顺序)。在这种需要稳定排名的场景下,可以考虑改用 rank() 或 dense_rank()。回到问题本身——Hive 的 row_number() 不仅能实现分组排序,而且实现得非常优雅。只要将 PARTITION BY 和 ORDER BY 组合好,几乎可以应对所有分组内排序的需求。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述