在 Hive 中,row_number() 作为一款高频窗口函数,其核心功能是为结果集中的每一行生成连续且唯一的整数编号。当它与嵌套查询结合使用时,能够衍生出多种灵活的数据处理场景。例如,如何在子查询结果的基础上为每行分配编号?下面的示例将清晰展示具体操作。

假设有一张 orders 订单表,包含 order_id(订单 ID)、customer_id(客户 ID)和 order_date(订单日期)。现需按客户分组,对每个客户的订单按日期降序排列,并标注行号。
第一步,先统计每个客户的订单总数——通过子查询即可实现:
SELECT customer_id, COUNT(*) as order_countFROM ordersGROUP BY customer_id;
第二步,将子查询结果与 orders 表关联,并配合 row_number() 窗口函数,即可为每个客户的订单逐一编号:
SELECT o.order_id, o.customer_id, o.order_date, ROW_NUMBER() OVER (PARTITION BY o.customer_id ORDER BY o.order_date DESC) as row_numFROM orders oJOIN (SELECT customer_id, COUNT(*) as order_countFROM ordersGROUP BY customer_id) sub ON o.customer_id = sub.customer_id;
此处关键点在于:PARTITION BY 定义了窗口函数的作用域,即每个客户单独成为一个分区;ORDER BY ... DESC 则指定分区内的排序规则(按日期降序)。这样一来,每个客户的最新订单行号即为 1,其余依次类推。子查询先汇总每个客户的订单总数,再关联主表进行编号,既获取了聚合统计数据,又保留了每行明细信息。
这种嵌套查询配合 row_number() 的写法在实际开发中非常实用,例如分析“每个客户的最近 N 条订单”,或需要同时展示聚合结果与行号时,几乎是标准解决方案。
