Big Query 匹配表之间的记录
Big Query match records between tables
我有两个表:
TableA
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
TableB
ID Gender Date
34446 F 2016-01-14
35689 F 2016-01-14
35679 F 2016-01-18
我试图弄清楚 TableB 中有多少记录(以及哪些记录)与 TableA 不匹配以及有多少匹配。两个表都有重复的 ID,这就是为什么我还需要使用 Date 字段来匹配记录的原因。 TableB 中的日期字段在表之间可能相差一两天。例如,Table B 的第一行应该与 Table 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
如果我没看错的话,你可以使用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(*)
。
我有两个表:
TableA
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
TableB
ID Gender Date
34446 F 2016-01-14
35689 F 2016-01-14
35679 F 2016-01-18
我试图弄清楚 TableB 中有多少记录(以及哪些记录)与 TableA 不匹配以及有多少匹配。两个表都有重复的 ID,这就是为什么我还需要使用 Date 字段来匹配记录的原因。 TableB 中的日期字段在表之间可能相差一两天。例如,Table B 的第一行应该与 Table 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
如果我没看错的话,你可以使用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(*)
。