Hive中row_number()窗口函数与嵌套查询结合,可对子查询结果逐行编号。通过PARTITIONBY按客户分区、ORDERBY按日期降序排序,实现每个客户订单编号。子查询先汇总订单总数,再关联主查询获取明细,便于分析每个客户最新订单等场景。
Hive row_number()嵌套查询处理方法
作者:技术拾光
时间:2026-06-28
浏览:360
文章目录
row_number()窗口函数基础
在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,依次类推。嵌套查询在这里的作用是先汇总出每个客户的订单总数,然后再带着这个信息去给订单标号,相当于既拿到了聚合数据,又保留了每行明细。
这种写法在实际场景里很实用,比如做“每个客户最近N条订单”的分析,或者需要同时展示聚合结果和行号时,嵌套加上row_number()几乎是标配方案。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章