HIVE SQL行转列实现:将同一clm_nb对应的part_nb合并为多列
Hive SQL实现行转置:将同一clm_nb的多个part_nb转为多列
嗨,针对你要在Hive SQL里实现行转置的需求——把同一clm_nb对应的多个part_nb合并到同一行的多列,我整理了两种实用的方法,刚好匹配你给出的数据场景:
先明确你的原始数据和期望输出:
原始数据:
clm_nb part_nb
008195066 20401
008195066 20411
008195179 89598
008195179 89599
008195277 56478
008195277 56477
期望输出(注:SQL中同一行不能有重复列名,我调整为
part_nb1、part_nb2,你可按需修改命名):
clm_nb part_nb1 part_nb2
008195066 20401 20411
008195179 89598 89599
008195277 56477 56478
方法一:窗口函数+条件聚合(推荐,扩展性强)
这种方法适用于clm_nb对应的part_nb数量不固定的场景,后续如果有更多值,只需新增分支即可:
SELECT clm_nb, MAX(CASE WHEN rn = 1 THEN part_nb END) AS part_nb1, MAX(CASE WHEN rn = 2 THEN part_nb END) AS part_nb2 -- 如果有更多part_nb,继续添加 MAX(CASE WHEN rn = 3 THEN part_nb END) AS part_nb3 FROM ( -- 先给每个clm_nb下的part_nb编排序号 SELECT clm_nb, part_nb, ROW_NUMBER() OVER(PARTITION BY clm_nb ORDER BY part_nb) AS rn FROM your_table_name -- 替换成你的实际表名 ) t GROUP BY clm_nb;
逻辑说明:
- 内层子查询用
ROW_NUMBER()窗口函数,按clm_nb分组,给每个分组内的part_nb编上序号(ORDER BY part_nb保证序号稳定,避免每次执行结果顺序乱掉); - 外层用
MAX()配合CASE WHEN做条件聚合,根据序号提取对应的part_nb值,把多行数据压缩成一行。
方法二:LEAD()窗口函数(适合固定数量的场景)
如果能确定每个clm_nb最多对应2个part_nb,可以用LEAD()函数直接取后续行的值,代码更简洁,但扩展性差:
SELECT DISTINCT clm_nb, part_nb AS part_nb1, LEAD(part_nb) OVER(PARTITION BY clm_nb ORDER BY part_nb) AS part_nb2 FROM your_table_name; -- 替换成你的实际表名
逻辑说明:
LEAD(part_nb)会取当前行所在clm_nb分组内的下一行part_nb值;- 用
DISTINCT去重,因为每个clm_nb会生成两行数据,去重后得到一行结果; - 如果某个
clm_nb只有1个part_nb,part_nb2会返回NULL,可以用COALESCE(LEAD(part_nb), '默认值')处理空值。
注意事项:
- 同一行不能有重复列名,所以示例里用了
part_nb1、part_nb2,你可以改成符合业务习惯的命名(比如first_part、second_part); - 如果
part_nb的顺序不重要,可以去掉ORDER BY part_nb,但建议保留以保证结果一致性。
内容的提问来源于stack exchange,提问作者Michael Martin
相关产品推荐
相关产品推荐

