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

解决UNPIVOT移除NULL值导致丢失原始行的技术问题

解决UNPIVOT自动移除NULL行的问题:用CROSS JOIN LATERAL替代

原始SQL代码

with physician_diag as (
   SELECT baseentityid, eventdate,locationid,teamid,average_muac,child_age,child_gender,physician_diagnosis, dignosis_data
   FROM [VITAL_DWH].[vr].[event_physician_visit]   
UNPIVOT  
   (dignosis_data FOR physician_diagnosis  IN   
      (
     well_baby,
severe_pneumonia
)  
) AS unpvt 
),
final as (
-- Final
select *, dense_rank() OVER (PARTITION BY baseentityid ORDER BY eventdate) AS rn from (
select * from physician_diag  
 ) F

问题说明

上述SQL使用UNPIVOT做行转列时,会自动过滤掉well_baby或severe_pneumonia字段为NULL的原始行,导致部分数据丢失。可以用CROSS JOIN LATERAL结合VALUES子句替代,实现保留所有包含NULL值的原始行的行转列效果。

修改后的SQL代码(保留NULL行)

with physician_diag as (
   SELECT 
       baseentityid, 
       eventdate,
       locationid,
       teamid,
       average_muac,
       child_age,
       child_gender,
       physician_diagnosis,
       dignosis_data
   FROM [VITAL_DWH].[vr].[event_physician_visit]
   -- 用CROSS JOIN LATERAL + VALUES替代UNPIVOT,保留NULL值
   CROSS JOIN LATERAL (
       VALUES
           ('well_baby', well_baby),
           ('severe_pneumonia', severe_pneumonia)
   ) AS unpvt(physician_diagnosis, dignosis_data)
),
final as (
-- Final
select *, dense_rank() OVER (PARTITION BY baseentityid ORDER BY eventdate) AS rn 
from physician_diag
)
-- 根据需求添加最终查询逻辑
select * from final;

逻辑说明

  • CROSS JOIN LATERAL会对每一行原始数据,与VALUES中的每一组值做关联,无论字段是否为NULL,都会生成对应的行。
  • VALUES子句的每一项对应原UNPIVOT中的列名和字段值:第一个元素是诊断名称(映射physician_diagnosis),第二个是对应字段的实际值(映射dignosis_data)。
  • 这种方式不会过滤NULL值,完美保留所有原始行的信息。

内容的提问来源于stack exchange,提问作者analyst92

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:42:24