如何通过在 BigQuery 中加入 2 个非嵌套表来创建嵌套表?

时间:2021-04-04 15:57:31

标签: google-bigquery

我有一种通过在 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 的单个查询中实现它? 通用查询请:-)

2 个答案:

答案 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`     

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

enter image description here

用于测试的数据 - 根据相关样本:

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

希望这对其他人也有帮助。

相关问题