如何比较标准 SQL(BigQuery)中的两个数组?

Posted

技术标签:

【中文标题】如何比较标准 SQL(BigQuery)中的两个数组?【英文标题】:How to compare two arrays in Standard SQL (BigQuery)? 【发布时间】:2021-02-14 14:43:21 【问题描述】:

我有两个具有完全相同架构的表,其中一个字段是记录,我尝试在两个表之间比较该字段。

例如:

表 A:

 Name: 'Mary',
  DOB: '06.06.1970',
  Children:[
             Name: John,   Age: 6 ,
             Name: Agatha, Age: 10
           ]
,
 Name: 'Bob',
  DOB: '30.03.1982',
  Children:[
             Name: Anthony, Age: 9 ,
             Name: William, Age: 4 ,
             Name: Rose,    Age: 2 
           ]
,
 Name: 'Adam',
      DOB: '312.10.1980',
      Children:[
                 Name: Andrew, Age: 9 ,
                 Name: Kate, Age: 4 
               ]
    

表 B:

 Name: 'Mary',
      DOB: '06.06.1970',
      Children:[
                 Name: John,   Age: 6 ,
                 Name: Agatha, Age: 10
               ]
    ,
     Name: 'Bob',
      DOB: '30.03.1982',
      Children:[
                 Name: Anthony, Age: 9 ,
                 Name: George,  Age: 4 ,
                 Name: Frank,   Age: 2 
               ]
    ,
     Name: 'Adam',
      DOB: '312.10.1980',
      Children:[
                 Name: Andrew, Age: 9 ,
                 Name: Kate, Age: 4 ,
                 Name: Jonathan,    Age: 2 
               ]
    

我想得到的输出是:

Name    
----------
Bob     
Adam    

由于表 A 和表 B 中 Bob 或 Adam 的子项详细信息不同(无论是记录的大小(子项数量)或详细信息(子项名称等...))

我尝试使用SELECT UNION DISTINCT,但它不适用于数组,我也尝试过!=<>,但它不适用于数组... 比较两个数组是比较理想的,就像在 Python 中比较两个列表一样(比较结构和内容)。

有没有办法实现类似的东西?

谢谢

【问题讨论】:

【参考方案1】:
select name
from `project.dataset.tableA` a
join `project.dataset.tableB` b
using(name)
where a.dob != b.dob 
or (select string_agg(format('%t', s) order by name) from a.children s) 
!= (select string_agg(format('%t', s) order by name) from b.children s)

【讨论】:

以上是关于如何比较标准 SQL(BigQuery)中的两个数组?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用“$”装饰器访问标准 SQL 中的 BigQuery 分区?

在 bigquery 标准 sql 上提取两个日期之间的小时数

在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?

如何在 BigQuery 标准 SQL 中取消嵌套多个数组

如何在 BigQuery 的标准 SQL 中解析具有不同日期字符串的列中的值

如何在 BigQuery 标准 SQL 中查询 Bigtable 列值?