GoogleSQL-如果需要,请选择

GoogleSQL-如果需要,请选择,sql,google-apps-script,google-bigquery,Sql,Google Apps Script,Google Bigquery,我正在使用这样的数据集结构 我想排除ReviewRound为“a”的所有记录,如果它们已通过“b”轮审核-如果一组唯一ID具有关联的“b”轮审核,则不应包括“a”轮审核 有些记录没有进入“b”轮。我遇到的问题是由于每个唯一ID都有多个记录 理想情况下,这可以在GoogleBigQuery中完成,如果不是,通过GoogleScripts进行过滤也可能是一种选择 如有任何建议,将不胜感激 如果一组唯一ID具有关联的“b”轮审核,则不应包括“a”轮审核 如果我没有弄错,您可以将其表示为not条件,并

我正在使用这样的数据集结构

我想排除ReviewRound为“a”的所有记录,如果它们已通过“b”轮审核-如果一组唯一ID具有关联的“b”轮审核,则不应包括“a”轮审核

有些记录没有进入“b”轮。我遇到的问题是由于每个唯一ID都有多个记录

理想情况下,这可以在GoogleBigQuery中完成,如果不是,通过GoogleScripts进行过滤也可能是一种选择

如有任何建议,将不胜感激

如果一组唯一ID具有关联的“b”轮审核,则不应包括“a”轮审核

如果我没有弄错,您可以将其表示为
not
条件,并使用相关子查询确保,如果当前记录具有
ReviewRound='a'
,则没有其他记录具有相同的
id
ReviewRound='b'

select t.*
from mytable t
where not (
    t.ReviewRound = 'a'
    and exists (
        select 1
        from mytable t1
        and t1.id = t.id and t1.ReviewRound = 'b'
    )
)
如果一组唯一ID具有关联的“b”轮审核,则不应包括“a”轮审核

如果我没有弄错,您可以将其表示为
not
条件,并使用相关子查询确保,如果当前记录具有
ReviewRound='a'
,则没有其他记录具有相同的
id
ReviewRound='b'

select t.*
from mytable t
where not (
    t.ReviewRound = 'a'
    and exists (
        select 1
        from mytable t1
        and t1.id = t.id and t1.ReviewRound = 'b'
    )
)

您也可以使用窗口功能执行此操作:

select t.* except (num_bs)
from (select t.*,
             countif(reviewround = 'b') over (partition by id) as num_bs
      from t
     ) t
where num_bs = 0 or reviewround = 'b';

您也可以使用窗口功能执行此操作:

select t.* except (num_bs)
from (select t.*,
             countif(reviewround = 'b') over (partition by id) as num_bs
      from t
     ) t
where num_bs = 0 or reviewround = 'b';

通过使用窗口函数,您可以使用此查询解决它

SELECT ID, Score
FROM (
  SELECT *, 
    MAX(CASE WHEN ReviewRound = 'b' THEN 1 ELSE 0 END) OVER (partition by ID) as has_b
  FROM mytable
) t
WHERE has_b = 0

通过使用窗口函数,您可以使用此查询解决它

SELECT ID, Score
FROM (
  SELECT *, 
    MAX(CASE WHEN ReviewRound = 'b' THEN 1 ELSE 0 END) OVER (partition by ID) as has_b
  FROM mytable
) t
WHERE has_b = 0