BIGQUERY - 查询所有具有唯一 SSN 和 DOB 值的 UUID,基于 UUID 列加入 2 个表

Posted

技术标签:

【中文标题】BIGQUERY - 查询所有具有唯一 SSN 和 DOB 值的 UUID,基于 UUID 列加入 2 个表【英文标题】:BIGQUERY - Query to find all UUID's which are having unique SSN and DOB values from joining 2 tables based on UUID column 【发布时间】:2021-04-22 01:59:11 【问题描述】:

假设有 2 张桌子。

表 1:匹配 表2:归一化

匹配表:列名:UUID

标准化表:列名:UUID、SSN、DOB

在 MATCH 表中有一个列“UUID”,在 NORMALIZED 表中有列“UUID”、SSN 和 DOB。加入这两个表后,需要获取具有唯一 SSN 和 DOB 的 uuid

需要通过连接 2 个表来获取下表中匹配的 UUIDs 记录

匹配表:UUID 列

Record # uuid
1 123456789
2 123456789
3 123456789
4 123456789
5 998764556
6 112233445

标准化表:UUID、SSN、DOB 列

Record # uuid ssn dob comment
1 123456789 54321 03/08/1986 SSN is repeated in record #3
2 123456789 98765 03/08/1986 DOB is repeated in record #1
3 123456789 54321 03/08/1986 SSN is repeated in record #1
4 123456789 77654 10/10/2000 SSN is repeated in record #5
5 998764556 77654 11/11/1960 SSN is repeated in record #4
6 112233445 66546 07/14/1970 SSN and DOB is unique

OUTPUT : 需要显示“所有具有 SSN 和 DOB 的 UUID 都是唯一的”。

Record # uuid
6 112233445

此记录应显示在输出中,因为此 UUID 的 SSN 和 DOB 在表中都是唯一的。

我尝试过以下查询:

场景 1:查找所有具有唯一 SSN 的 UUID

QUERY : select * from MATCH_TABLE where UUID in (select DISTINCT UUID from NORMALIZED_TABLE A,MATCH_TABLE B where A.uuid=B.uuid and A.SSN is not null AND A.SSN in (SELECT C.SSN from NORMALIZED_TABLE C GROUP BY C.SSN 有 count(1)

场景 2:查找所有具有唯一 DOB 的 UUID

QUERY: select * from MATCH_TABLE where UUID in (select DISTINCT UUID from NORMALIZED_TABLE A,MATCH_TABLE B where A.uuid=B.uuid and A.DOB is not null AND A.DOB in (SELECT C.DOB from NORMALIZED_TABLE C GROUP BY C.DOB 有 count(1)

场景 3:查找所有具有唯一 SSN 和 DOB 的 UUID。

QUERY: select * from MATCH where UUID in (select distinct a.uuid from NORMALIZED a,MATCH b where a.uuid=b.uuid and a.ssn is not null and a.dob is not null and CONCAT(a .ssn,a.dob) in (select concat(c.ssn,c.dob) from NORMALIZED c group by c.ssn,c.dob with count(1)

我没有得到正确的输出。谁能帮我查询一下。

【问题讨论】:

能否也提供一个输入示例? @SergeyGeron,上表是输入示例,抱歉造成混淆。我已经用 Input 和 Output 更新了表格描述。 【参考方案1】:

另一种解决方案是

select * from (
  select as value any_value(t) from `project.dataset.table` t 
  group by ssn having count(1) = 1
) intersect distinct 
select * from (
  select as value any_value(t) from `project.dataset.table` t 
  group by dob having count(1) = 1
)   

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

【讨论】:

感谢您的查询,当我申请原始表时,我使用了此查询 select * from ( select as value any_value(t) from project.dataset.table t group by SSN with count(1) = 1 ) intersect distinct select * from ( select as value any_value(t) from project.dataset.table t group by BIRTH_DATE with count(1) = 1) 我得到零记录。在查询中,我应该在“value any_value(t)”中给出任何 SSN 值或 BIRTH_DATE 值。你能帮帮我吗.. 我已经在原始问题中添加了详细示例。能否请您纠正我做错的地方,如果我做错了,请更正查询,请【参考方案2】:

尝试窗口化count(*) over(partition by column_name):

with mytable as (
  select 1 as record, 123456789 as uuid, 54321 as ssn, '03/08/1986' as dob union all
  select 2, 123456789, 98765, '03/08/1986' union all
  select 3, 123456789, 54321, '03/08/1986' union all
  select 4, 123456789, 77654, '10/10/2000' union all
  select 5, 998764556, 77654, '11/11/1960' union all
  select 6, 112233445, 66546, '07/14/1970'
)
select *
from (
  select 
    *,
    count(*) over (partition by ssn) as ssn_count,
    count(*) over (partition by dob) as dob_count
  from mytable
)
where ssn_count = 1 and dob_count = 1

【讨论】:

当我应用原始表中提供的逻辑时,它给出了零记录作为输出。这意味着没有SSN和DOB组合的唯一记录?? SELECT * FROM(SELECT ,COUNT() OVER(PARTITION BY SSN)AS SSN_COUNT,COUNT(*) OVER(PARTITION BY BIRTH_DATE)AS BIRTH_DATE_COUNT FROM TABLE_NAME) WHERE SSN_COUNT=1 AND BIRTH_DATE=1 你能如果我的查询正确,请更正。 是的,没有唯一记录。查询看起来不错。 如果我需要加入另一个表(savvy_match)。我该怎么做??两个表中的共同列是 UUID,我该如何实现呢?我已经编写了连接查询 select * from MATCH where UUID in (select distinct a.uuid from NORMALIZED a,MATCH b where a.uuid=b.uuid and a.ssn is not null and a.dob is not null and CONCAT( a.ssn,a.dob) in (select concat(c.ssn,c.dob) from NORMALIZED c group by c.ssn,c.dob with count(1) 不确定我是否遵循...您能否提供所有表的输入数据和预期输出的示例? 对不起,真的很难理解。您能否以表格格式提供输入示例(如您的原始问题)?将其添加到您的原始问题中,或者创建一个新问题,以便其他人也可以提供帮助。

以上是关于BIGQUERY - 查询所有具有唯一 SSN 和 DOB 值的 UUID,基于 UUID 列加入 2 个表的主要内容,如果未能解决你的问题,请参考以下文章

如何创建唯一索引

BigQuery - 具有范围聚合的查询中的重复行

从 BigQuery 中删除重复记录

Bigquery - UNION ALL 具有不同参数的相同查询

联合所有多个查询 Google BigQuery

BigQuery 将查询结果附加到具有必填字段的表中