You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明:

  1. 内层子查询用ROW_NUMBER()窗口函数,按clm_nb分组,给每个分组内的part_nb编上序号(ORDER BY part_nb保证序号稳定,避免每次执行结果顺序乱掉);
  2. 外层用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;  -- 替换成你的实际表名

逻辑说明:

  1. LEAD(part_nb)会取当前行所在clm_nb分组内的下一行part_nb值;
  2. 用DISTINCT去重,因为每个clm_nb会生成两行数据,去重后得到一行结果;
  3. 如果某个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:00:21