BigQuery中用CASE语句实现IF逻辑:如何返回表数据而非仅1/0?
解决BigQuery中CASE语句仅返回1/0、无法查询原表数据的问题
我明白你的问题了——你现在的查询只能返回1或0,没法带出原表的实际数据,核心问题是你用了一个独立的子查询去统计重复数,而没有把这个判断和原表的每一行关联起来。
错误原因分析
你当前的写法是通过子查询统计DISTINCT字段组合的行数,再用CASE判断这个总数是否大于1,最终只会返回单个布尔值(1或0),而不是将重复标记绑定到原表的每一行数据上。
解决方案:用窗口函数关联原表数据
要同时返回原表数据和重复标记,推荐使用窗口函数COUNT() OVER(),它可以为每一行计算其对应字段组合的总行数,这样既能保留原表所有字段,又能添加重复标记列。
基础实现:返回原表数据+重复标记
SELECT ESCO, SOURCE, LDCTEXT, STATUS, DDR_DATE, TempF, HeatingDegreeDays, DecaTherms, -- 标记当前行的字段组合是否存在重复:有重复返回1,无重复返回0 CASE WHEN COUNT(1) OVER( PARTITION BY ESCO, SOURCE, LDCTEXT, STATUS, DDR_DATE, TempF, HeatingDegreeDays, DecaTherms ) > 1 THEN 1 ELSE 0 END AS has_duplicate FROM `gas-ddr.gas_ddr_outbound.LexingtonDDRsOutbound_onchange_Prior_Filtered`
扩展场景:筛选重复行
如果只需要提取存在重复的行,可以用CTE先标记,再筛选:
WITH flagged_duplicates AS ( SELECT *, COUNT(1) OVER( PARTITION BY ESCO, SOURCE, LDCTEXT, STATUS, DDR_DATE, TempF, HeatingDegreeDays, DecaTherms ) AS duplicate_count FROM `gas-ddr.gas_ddr_outbound.LexingtonDDRsOutbound_onchange_Prior_Filtered` ) SELECT * EXCEPT(duplicate_count) FROM flagged_duplicates WHERE duplicate_count > 1
扩展场景:去重后返回唯一行
如果需要去除重复,保留每个字段组合的唯一一行,可以用ROW_NUMBER()窗口函数:
WITH ranked_rows AS ( SELECT *, ROW_NUMBER() OVER( PARTITION BY ESCO, SOURCE, LDCTEXT, STATUS, DDR_DATE, TempF, HeatingDegreeDays, DecaTherms ORDER BY (SELECT NULL) -- 若需要指定保留规则,可替换为具体字段如DDR_DATE DESC ) AS row_rank FROM `gas-ddr.gas_ddr_outbound.LexingtonDDRsOutbound_onchange_Prior_Filtered` ) SELECT * EXCEPT(row_rank) FROM ranked_rows WHERE row_rank = 1
内容的提问来源于stack exchange,提问作者bcascone
相关产品推荐
相关产品推荐

