Redshift如何判断特定值在同一行多列中出现次数是否大于1
Redshift跨列统计特定值出现次数的简洁实现
你原来的自关联方案逻辑可运行,但存在额外的表关联开销,可以用更简洁的方式实现,无需子查询、无需多表关联,仅单次扫描表即可完成计算:
方案1:布尔值转整数直接求和(性能最优)
利用Redshift支持布尔值强制转换为整数的特性(true转1、false转0),直接对字段匹配结果求和即可得到X的出现次数:
select id, A, B, C, D, E, ( (A = 'X')::int + (B = 'X')::int + (C = 'X')::int + (D = 'X')::int + (E = 'X')::int ) > 1 as Result from foo -- 若仅需要保留至少包含1个X的行,打开下方where条件 -- where 'X' in (A,B,C,D,E)
方案2:数组展开计数(扩展性更强)
如果后续需要统计的字段数量可能变动,可以将字段转为数组后展开计数,修改时只需调整数组内的字段列表即可:
select id, A, B, C, D, E, ( select count(*) from unnest(array[A,B,C,D,E]) as col(val) where val = 'X' ) > 1 as Result from foo -- 同方案1,需筛选仅含X的行可打开下方条件 -- where 'X' in (A,B,C,D,E)
两种方案均可以得到和示例完全匹配的输出结果,相比原关联写法减少了子查询与关联开销,执行效率更高,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者seb
相关产品推荐
相关产品推荐

