两列上的BigQuery DeDuplication作为唯一键

Dov*_*ovy 1 sql google-bigquery gcp

我们虔诚地使用BigQuery,并且实际上有两个表是由不同的进程并行更新的。我有一个问题,我们没有表的唯一标识符,目标是在可能的情况下将两个表合并为零重复。唯一标识符是两个列的组合。

我已经尝试过各种基于MySQL的查询,但似乎都无法在BigQuery中使用。因此,我在这里发布一些帮助。:)

步骤1.将“ clean”表复制到新的合并表中。

步骤2.查询“ dirty”(旧)表并插入所有丢失的条目。

查询尝试1:

SELECT
  COUNT(c.*)
FROM
  [flash-student-96619:device_data.device_datav3_20160530] AS old
WHERE NOT EXISTS (
  SELECT
    1
  FROM
    [flash-student-96619:device_data_v7_merged.20160530] AS new
  WHERE
    new.dsn = old.dsn
    AND new.timestamp = old.timestamp 
)
Run Code Online (Sandbox Code Playgroud)

错误:错误发生在:6.1-10.65。一次只能执行一个查询。

查询尝试2:

SELECT
  *
FROM
  [flash-student-96619:device_data.device_datav3_20160530]
WHERE
  (dsn, timestamp) NOT IN (
  SELECT
    dsn,
    timestamp
  FROM
    [flash-student-96619:device_data_v7_merged.20160530] 
  )
Run Code Online (Sandbox Code Playgroud)

错误:在第6行第7列遇到“”,“”,“”。期望:“)” ...

老实说,如果我可以在一个查询中做到这一点,我会很高兴。我需要从两个表中获取数据,并使用唯一数据创建一个新表。

有什么帮助吗?

Mik*_*ant 5

像下面这样的东西应该工作

SELECT * 
FROM (
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY dsn, timestamp) AS dup
  FROM
    [flash-student-96619:device_data.device_datav3_20160530],
    [flash-student-96619:device_data_v7_merged.20160530] 
) 
WHERE dup = 1  
Run Code Online (Sandbox Code Playgroud)

我建议在外部SELECT中使用显式字段列表而不是*,以便您可以从实际输出中省略dup