【问题标题】:How to query a Google BigQuery table and remove duplicates based on a subset of columns?如何根据列的子集查询 Google BigQuery 表并删除重复项?
【发布时间】:2018-11-16 06:39:27
【问题描述】:

我有一个查询,它连接两个 google 表并生成一个包含 6 列的表(abcdef)。接下来,我将该表移动到一个谷歌存储桶,然后将该谷歌存储桶下载到一堆 CSV 文件中。最后,我将这些 CVS 插入到具有 2 个主键 abpostgres 数据库表中。

问题是 google 表中没有主键,并且某些行只有一个值不同,所以我需要生成一个在 ab 中没有重复的查询结果。我已经尝试了以下...

SELECT
  DISTINCT A.a,
           A.b,
           A.c AS c, 
           A.d AS d,
           B.c AS e,
           B.d AS f
FROM
  `my_proj.my_table_A` A
FULL OUTER JOIN
  `my_proj.my_table_B` B
ON
  A.a = B.a
  AND A.b = B.b

...但如果f 不同,它仍然允许ab 有重复项。我只需要其中一个重复的行,哪一个都没有关系。

如何仅根据ab 删除重复项?

【问题讨论】:

  • 如果您仅基于ab 进行重复数据删除,那么不同的f 值会发生什么?你打算放弃其中一个吗?
  • @ElliottBrossard,是的,只需删除其中一个,因为我只需要其中一个。

标签: sql google-bigquery


【解决方案1】:

GROUP BYANY_VALUE 一起使用:

SELECT
  A.a,
  A.b,
  ANY_VALUE(A.c) AS c, 
  ANY_VALUE(A.d) AS d,
  ANY_VALUE(B.c) AS e,
  ANY_VALUE(B.d) AS f
FROM
  `my_proj.my_table_A` A
FULL OUTER JOIN
  `my_proj.my_table_B` B
ON
  A.a = B.a
  AND A.b = B.b
GROUP BY
  A.a,
  A.b

【讨论】:

  • 这可能有效,但BigQuery 会终止工作并请求执行“大工作”的权限,我不想给予。我认为我要走的路是对表进行重复数据删除,然后对它们运行我的查询。这可能是一个单独的问题,但是您知道如何对仅基于两列(如ab)的表进行重复数据删除吗?
  • 我不知道“大工作”是什么意思。这个答案已经展示了如何基于ab 进行重复数据删除...只需使用GROUP BYANY_VALUE,您也可以将此模式应用于单个表。
  • “大工作”是指我得到了错误Error: Resources exceeded during query execution: The query could not be executed in the allotted memory. GROUP BY operator used too much memory,所以我需要一种不使用GROUP BY 子句的方法
猜你喜欢
  • 1970-01-01
  • 2019-08-19
  • 2014-01-27
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2018-09-29
相关资源
最近更新 更多