Select 个不同的行,其中所有值都在组中

Select distinct rows where all values are in group

我有一个 table 存储一对多关系(caseidcode)。一个caseid可以有很多code

我想 select 给定 caseid 的所有 code 都包含在一组 codes 中的所有行。如果 caseid 不在 中的任何 code 关联,则将其排除,无论其他 codes 是否都在组。

然后我想构建一个 table,其中每个唯一 caseid 都有一行和四个布尔列(一个用于我要查找的每个代码),表示该代码是否存在。

到目前为止,这是我的查询:

select distinct(caseid), _43280, _43279, _43282, _43281 from
(select caseid,   
  0 < countif(code = "43280") as _43280,
  0 < countif(code = "43279") as _43279,
  0 < countif(code = "43282") as _43282,
  0 < countif(code = "43281") as _43281
from mytable
inner join (
  select caseid, logical_and(code in ('43280', '43279', '43282', '43281')) as include,
  from mytable
  group by caseid
  having include
  ) 
using(caseid)
group by caseid
order by caseid)

一个例子 table 可能是:

caseid | code
1         43280
1         43279
1         43282
2         43280
2         43279
2         43282
2         99999
3         43280
3         43279
3         43282

结果应该是:

caseid | _43280 | _43279 | _43282 | _43281
 1        TRUE     TRUE     TRUE     FALSE
 3        TRUE     TRUE     TRUE     FALSE

您可以按如下方式使用条件聚合:

select caseid,
    logical_or(code = 43280) code_43280,
    logical_or(code = 43279) code_43279,
    logical_or(code = 43282) code_43282,
    logical_or(code = 43281) code_43281
from mytable
group by caseid
having not logical_or(code not in (43280, 43279, 43282, 43281))

以下适用于 BigQuery 标准 SQL 并使用 BQ 脚本

#standardsql
create temp table data as
select caseid, array_agg(code) as codes, 
from `project.dataset.table` t
left join unnest(['43280', '43279', '43282', '43281']) test_code
on code = test_code 
group by caseid
having countif(test_code is null) = 0;

execute immediate (
  select """
  select caseid, """ || 
    string_agg("""max(if(code = '""" || code || """', true, false)) as _""" || replace(code, '.', '_'), ', ') 
  || """
  from data, unnest(codes) code 
  group by caseid
  """
  from unnest(['43280', '43279', '43282', '43281']) code
);   

如果应用于您问题中的示例数据 - 输出为