IF 列有重复值 THEN 选择下一个

问题描述

感谢您对此进行调查。

我如何在 Bigquery sql 中编写 IF 语句,总结一下单元数(如果 QUARTER 列具有相同的季度,则选择带有 TYPE ACTL、OTLK、ETC 的单元数)。 TYPE CWV 是历史数据,所以可以有重复的季度,但如果有 TYPE ACTL、OTLK 等的单位与 CWV 中的季度相同,那么我希望 sql 选择带有 TYPE ACTL、OTLK 等的单位而不是 CWV。

注意:此 sql 将用于 Tableau,我的 XYZ 单位总数应为 977071(不包括 CWV / FY20-Q4 / 104955)

TMC_BC TYPE 程序 四分之一 UNITS
1 TMC ACTL XYZ FY20-Q2 0
2 TMC OTLK XYZ FY20-Q3 6500
3 TMC CWV XYZ FY20-Q4 104955
4 TMC ACTL XYZ FY20-Q4 191300
5 TMC CWV XYZ FY21-Q1 182448
6 TMC_BC CWV XYZ FY21-Q2 91346
7 TMC CWV XYZ FY21-Q2 158126
8 TMC_BC CWV XYZ FY21-Q1 62500
9 TMC CWV XYZ FY21-Q1 157287
10 TMC_BC CWV XYZ FY21-Q1 62500
11 TMC CWV XYZ FY21-Q1 31410
12 TMC_BC CWV XYZ FY21-Q1 33654

我当前的 sql

SELECT
case when tmc <= 0 then 'TMC_BC'
      else 'TMC'
      end as TMC_BC,TYPE,PROGRAM,QUARTER,sum(ca) as UNITS,from xx_REPORTS
where PROGRAM like 'XYZ'
and TYPE <> 'PDP' and TYPE <> 'POR'
and GEO = 'NA'
group by 1,2,3,4
order by 4 asc

解决方法

嗯。 . .如果我理解正确,您只需要 'CWV' 时没有其他类型的季度/程序/tmc_bc 组合。您可以使用窗口函数进行此过滤:

select r.*
from (select r.*,count(*) over (partition by quarter,program,tmc_bc) as q_cnt,countif(type = 'CWV') over (partition by quarter,tmc_bc) as q_cnt_cwv
      from xx_REPORTS r
     ) r
where (q_cnt = q_cnt_cwv) or (type <> 'CWV');

实际上,如果逻辑正确,那么您想要的是非CMV行(如果有),否则所有行。一个更简单的表达是:

select r.*
from (select r.*,countif(type <> 'CWV') over (partition by quarter,tmc_bc) as q_cnt_noncwv
      from xx_REPORTS r
     ) r
where (q_cnt_noncwv > 0 and type <> 'CWV') or q.cnt_noncwv = 0;