HiveQL中CASE WHEN带SPLIT切片判断和LEFT OUTER JOIN连用报错

15 篇文章 1 订阅
在HiveQL中,使用CASEWHEN结合SPLIT函数进行日期季度分类,并与LEFTOUTERJOIN操作一起使用时出现错误。错误源于CASEWHEN在多条件左连接时可能的复杂性。解决办法是先执行LEFTOUTERJOIN,然后再应用CASEWHEN。通过调整查询语句的顺序,可以避免错误并成功完成数据处理。
摘要由CSDN通过智能技术生成

项目场景:

项目场景:数仓模型表


问题描述:

HiveQL中CASE WHEN带SPLIT切片判断和LEFT OUTER JOIN连用报错。
在这里插入图片描述

SELECT
    *
FROM
(
    SELECT
        customer_id
       ,target_date
	   ,target_qty
       ,COALESCE(CASE WHEN SPLIT(target_date, '-')[1] IN ('01', '02', '03') THEN 'Q1'
                      WHEN SPLIT(target_date, '-')[1] IN ('04', '05', '06') THEN 'Q2'
                      WHEN SPLIT(target_date, '-')[1] IN ('07', '08', '09') THEN 'Q3'
                      WHEN SPLIT(target_date, '-')[1] IN ('10', '11', '12') THEN 'Q4'
                 END, '空')                                    AS target_quarter
       ,SPLIT(target_date, '-')[0]                             AS target_year
    FROM ods.ods_xxx
    WHERE pt_d = '${pt_d}'
    AND customer_id IS NOT NULL
) t1
LEFT OUTER JOIN
(
    SELECT
        id
       ,mdm_code
       ,name
    FROM ods.ods_yyy
    WHERE pt_d = '${pt_d}'
) t2
ON t1.customer_id = t2.id
;

原因分析:

只要加上SPLIT切片再用CASE WHEN判断分类就会报错,个人感觉是否为多种情况左连接出错,具体原因未知,求大佬解答。


解决方案:

先LEFT OUTER JOIN处理完数据再做CASE WHEN就不会报错。

SELECT
    *
FROM
(
    SELECT
        customer_code
       ,provider_name
       ,target_date
       ,provider_sale_target
       ,COALESCE(CASE WHEN SPLIT(target_date, '-')[1] IN ('01', '02', '03') THEN 'Q1'
                      WHEN SPLIT(target_date, '-')[1] IN ('04', '05', '06') THEN 'Q2'
                      WHEN SPLIT(target_date, '-')[1] IN ('07', '08', '09') THEN 'Q3'
                      WHEN SPLIT(target_date, '-')[1] IN ('10', '11', '12') THEN 'Q4'
                 END, '空')                                    AS target_quarter
       ,SPLIT(target_date, '-')[0]                             AS target_year
    FROM
  (
      SELECT
            UUID()                                                  AS etl_id
           ,t2.mdm_code                                             AS customer_code
           ,t2.name                                                 AS provider_name
           ,COALESCE(t1.target_date, '空')                          AS target_date
           ,COALESCE(t1.target_qty, '空')                           AS provider_sale_target
           ,DATE_FORMAT(CURRENT_TIMESTAMP,'yyyy-MM-dd HH:mm:ss')    AS etl_time
        FROM
        (
            SELECT
                customer_id
               ,target_date
               ,target_qty
            FROM ods.ods_xxx
            WHERE pt_d = '${pt_d}'
            AND customer_id IS NOT NULL
        ) t1
        LEFT OUTER JOIN
        (
            SELECT
                id
               ,mdm_code
               ,name
            FROM ods.ods_yyy
            WHERE pt_d = '${pt_d}'
        ) t2
        ON t1.customer_id = t2.id
  )aa
) t3
;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张六十zhangliushi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值