Big Query 匹配表之间的记录

Posted

技术标签:

【中文标题】Big Query 匹配表之间的记录【英文标题】:Big Query match records between tables 【发布时间】:2020-09-21 21:46:57 【问题描述】:

我有两张桌子:

表A

ID          Gender               BeginDate      
034446         F          2016-01-15T00:00:00
034446         F          2020-02-17T00:00:00
035689         F          2016-01-14T00:00:00
035679         F          2016-01-18T00:00:00
045687         F          2020-05-21T00:00:00

表B

ID            Gender        Date        
34446         F          2016-01-14
35689         F          2016-01-14
35679         F          2016-01-18

我试图弄清楚 TableB 中有多少记录(以及哪些记录)与 Table A 不匹配,以及有多少记录匹配。两个表都有重复的 ID,这就是为什么我还需要使用 Date 字段来匹配记录。 TableB 中的日期字段可能会在表之间间隔一两天。例如,表 B 的第一行应该与表 A 的第一行匹配,而不是第二行。需要有一个声明,说明 TableA 日期字段等于或介于 TableB 日期字段的一两天之间。我试图在下面写一个查询,但日期设置彼此相等。

SELECT a.ID, CONCAT('0',CAST(b.ID AS STRING)), EXTRACT(DATE FROM a.BeginDate) AS date
FROM `dev.tableA` a
LEFT OUTER JOIN `dev.TableB` b
ON a.ID = CONCAT('0',CAST(b.ID AS STRING))
AND EXTRACT(DATE FROM a.BeginDate) = b.Date

【问题讨论】:

【参考方案1】:

如果我没听错,你可以使用exists

select b.*
from tableb b
where not exists (
    select 1
    from tablea a 
    where a.id = b.id
        and a.begindate >= date_sub(b.date, interval 2 day)
        and a.begindate <= date_add(b.date, interval 2 day)
)

这会带来b 的记录,在a 中不存在与相同id 和日期在+/- 两天内的匹配项。如果确实有必要,您可以在 id 上添加演员表,并根据需要调整边界。

如果您想要总记录数,只需将 b.* 替换为 count(*)

【讨论】:

谢谢!这正是我想要弄清楚的。

以上是关于Big Query 匹配表之间的记录的主要内容,如果未能解决你的问题,请参考以下文章

应用电子商务操作过滤器时,Big Query 和 Google Analytics UI 不匹配

SQL Query 从不同的表中选择相同的数据,显示所有记录,但显示/显示匹配

发现 2 个表之间不匹配记录的最快方法是啥?

如何使用 Access VBA 删除表之间的匹配行/记录?

mysql 如何查找同一表中两行之间的差异并列出不匹配的记录? mysql在表中查找不匹配的行

关于Google Big Query中数据框中的DateTime与DateTime的问题