如何比较标准 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 中的多个字段?