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) fromproject.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 个表的主要内容,如果未能解决你的问题,请参考以下文章