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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:30:30