我有一种通过在 BigQuery 中连接 2 个普通表来创建嵌套重复表的情况。 这是上下文,
我的输入表数据包含如下所示:在下面的数据中,v_no 是一个列,而 crit 是另一个包含更多数据的列。 cirt col 应该为每 6 个字符拆分(我在下面的查询中进行了修改)。
v_no crit
v1 EA1 TEMP MR
v2 DRA KM
另一个输入表包含这样的数据:
c_code o_code
TEMP 720
MR D45
EA1 E88
KM 282
DRA 121
现在需要的是我需要加入这两个表并创建一个嵌套重复表。预期的输出应该是这样的。
v1 EA1 E88
TEMP 720
MR D45
v2 DRA 121
KM 282
我通过拆分每个 6 个字符来从 table1 创建嵌套表。然后我不确定如何加入其他表。
CREATE TABLE
`project.db.table1`
CLUSTER BY
v_no AS
SELECT
v_no,
ARRAY_AGG(STRUCT(crit)) as codes
FROM
`project.db.table2`,unnest(regexp_extract_all(crit, r'.{1,6}')) crit
GROUP BY
v_no
谁能建议如何在 BigQuery 的单个查询中实现它? 通用查询请:-)
答案 0 :(得分:2)
在下面使用
select v_no,
array(
select as struct c_code, o_code
from unnest(regexp_extract_all(crit, r'.{1,6}')) code
join `project.dataset.table2`
on trim(code) = c_code
) codes
from `project.dataset.table1`
如果应用于您问题中的样本数据 - 输出为
用于测试的数据 - 根据相关样本:
with `project.dataset.table1` as (
select 'v1' v_no, 'EA1 TEMP MR' crit union all
select 'v2', 'DRA KM'
), `project.dataset.table2` as (
select 'TEMP' c_code, '720' o_code union all
select 'MR', 'D45' union all
select 'EA1', 'E88' union all
select 'KM', '282' union all
select 'DRA', '121'
)
答案 1 :(得分:0)
经过深入研究后,我了解到 v_no 在按每 6 个字符拆分后未按排序顺序排列。所以,我构建了一个查询来满足需求。
这是我的查询:
CREATE TABLE `table_tgt`
CLUSTER BY v_no AS
WITH mytable AS (SELECT v_no,TRIM(crit) AS crit FROM `inp_table_1`,
UNNEST(REGEXP_EXTRACT_ALL(crit, r'.{1,6}')) crit ORDER BY v_no )
SELECT v_no, ARRAY_AGG(STRUCT(crit, o_code)) AS critrec
FROM mytable LEFT JOIN `inp_table_2`
ON TRIM(crit) = TRIM(c_code)
GROUP BY v_no
希望这对其他人也有帮助。