如何筛选数据行:存在非空值时排除null,全为null则保留
数据清洗需求与简便解决方案
原始数据表
key1 value1 key1 value2 key1 null key2 null key3 null key3 value
期望结果表
key1 value1 key1 value2 key2 null key3 value
核心需求拆解
简单总结规则:
- 保留所有
value不为null的行 - 若某个
key对应的所有value都是null,则保留该key的null行 - 若
key下存在非null的value,直接剔除该key的null行
简便解决方案(以SQL为例)
用窗口函数可以一步到位,无需单独统计总行数和null行数:
方案1:基于非null值计数判断
SELECT key, value FROM ( SELECT key, value, -- 统计当前key下非null值的数量 COUNT(CASE WHEN value IS NOT NULL THEN 1 END) OVER (PARTITION BY key) AS non_null_cnt FROM your_table ) t -- 过滤规则:要么value非null,要么该key没有任何非null值 WHERE value IS NOT NULL OR non_null_cnt = 0;
方案2:基于是否存在非null值判断
SELECT key, value FROM ( SELECT key, value, -- 标记当前key是否存在非null值(1=存在,0=不存在) MAX(CASE WHEN value IS NOT NULL THEN 1 ELSE 0 END) OVER (PARTITION BY key) AS has_non_null FROM your_table ) t WHERE value IS NOT NULL OR has_non_null = 0;
这两种方法通过窗口函数给每一行打上所属key的非null值状态标记,再通过过滤条件直接得到目标结果,逻辑清晰且效率较高。
内容的提问来源于stack exchange,提问作者user5764
相关产品推荐
相关产品推荐

