Select 个不同的行,其中所有值都在组中
Select distinct rows where all values are in group
我有一个 table 存储一对多关系(caseid
到 code
)。一个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
);
如果应用于您问题中的示例数据 - 输出为
我有一个 table 存储一对多关系(caseid
到 code
)。一个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
);
如果应用于您问题中的示例数据 - 输出为