impala行转列问题

在这里插入图片描述
由于impala不能使用 LATERAL VIEW EXPLODE
需要行转列时,可采用加辅助列的方式:

DROP TABLE IF EXISTS ZHYW.T0;
CREATE TABLE IF NOT EXISTS ZHYW.T0 AS 
SELECT '1' AS NM,'A,B,C' AS ID 
UNION ALL
SELECT '2' AS NM,'A,B,C,D' AS ID 
;

在这里插入图片描述

DROP TABLE IF EXISTS ZHYW.T01;
CREATE TABLE IF NOT EXISTS ZHYW.T01 AS 
SELECT NM
,LENGTH(REGEXP_REPLACE(ID,'[A-Z]',''))+1 AS MAX_LOC
FROM ZHYW.T0 ;

在这里插入图片描述

DROP TABLE IF EXISTS ZHYW.T1;
CREATE TABLE IF NOT EXISTS ZHYW.T1 AS 
SELECT '1' AS NUM
UNION ALL
SELECT '2' AS NUM
UNION ALL
SELECT '3' AS NUM
UNION ALL
SELECT '4' AS NUM
UNION ALL
SELECT '5' AS NUM
UNION ALL
SELECT '6' AS NUM
UNION ALL
SELECT '7' AS NUM
;

在这里插入图片描述

行转列结果展示:

WITH  T2 AS ( SELECT NM,MAX_LOC FROM ZHYW.T01 )                                   -- 注意 WITH后面的表名 如果表名前加了库名会报错
     ,T3 AS (SELECT ROW_NUMBER() OVER (ORDER BY NUM ) AS RN FROM ZHYW.T1)         -- 这里为了得到一列从1开始的自然数,也可以选任意一张表的主键,根据主键排序可以取从1开始的自然数

SELECT T0.NM,T0.ID,T4.RN,SPLIT_PART(T0.ID,',',T4.RN) AS SPLIT_ID
FROM ZHYW.T0   T0
LEFT JOIN (
        SELECT T2.NM,T2.MAX_LOC,T3.RN
        FROM  T2
        LEFT JOIN  T3
        ON CAST(T2.MAX_LOC AS INT) >= T3.RN
) T4
ON T0.NM = T4.NM
;

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值