【问题标题】:Store only 1 values and remove the rest for same duplicated values in bigquery仅存储 1 个值并删除 bigquery 中相同重复值的其余值
【发布时间】:2020-11-12 22:55:18
【问题描述】:

我的数据中有重复值。但是,从重复值中,我只想存储 1 个值并删除其余相同的重复值。 到目前为止,我已经找到了删除所有重复值的解决方案。

代码:

  SELECT ID, a.date as date.A, b.date as date.B, 
       CASE WHEN a.date <> b.date THEN NULL END AS b.date
except(date.A)

FROM
    table1 a LEFT JOIN table2 b
 USING (ID)
WHERE date.A = 1

示例输入:

示例输出(仅存储重复值中的 1 个值并删除其余值):

注意:查询可能会出错,因为它会删除所有重复的值。

【问题讨论】:

  • 在您的数据样本中,您没有主键 .. 那么如何尝试删除具有相同值的行而不是另一行?? .. 更新您的数据示例,添加信息以定义主键
  • 使用真实数据库编辑。 ID不是主键吗?它将是具有重复行的其他 ID
  • 查看您的示例 .. 我看到的总是相同的值 .. 根据定义,主键必须是唯一的 .. 因此,如果您的有效主键很容易删除 duplicatedc 行,否则是不可能的..
  • 是否可以像 ..remove * where date > 1 for each ID (?) ..sorry not a right query, but my idea is there
  • 您的查询真的很难听懂。您错误地使用了exceptcase 表达式没有意义。

标签: sql google-bigquery


【解决方案1】:

考虑您的屏幕截图的示例数据和您的解释。我了解您希望从仅保留一行唯一数据的表中删除重复项。因此,我能够创建一个查询来仅选择一行数据而忽略重复项。

为了选择没有任何重复的行,您可以使用SELECT DISTINCT。根据文档,它会丢弃任何重复的行。除此方法外,CREATE TABLE 语句还将用于使用不重复的新数据创建新表(或替换之前的表)。语法如下:

CREATE OR REPLACE TABLE project_id.dataset.table AS
SELECT DISTINCT ID, a.date as date.A, b.date as date.B, 
       CASE WHEN a.date <> b.date THEN NULL END AS b.date
except(date.A)

FROM
    table1 a LEFT JOIN table2 b
USING (ID)
WHERE date.A = 1

输出将与您在问题中分享的完全相同。

请注意,我使用了 CREATE OR REPLACE,这意味着如果您将 project_id.dataset.table 设置为与您选择的表格的路径相同,它将替换您当前的表格(如果您的数据来自一个唯一的表格)。否则,它将使用指定的新表名称创建一个新表。

【讨论】:

    【解决方案2】:

    您可以使用聚合。像这样的:

    SELECT ANY_VALUE(a).*, ANY_VALUE(b).*
    FROM table1 a LEFT JOIN
         table2 b
         USING (ID)
    WHERE date.A = 1
    GROUP BY id, a.date;
    

    对于每个id/datecombination, this returns an arbitrary matching row froma/b`。

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2022-01-23
      相关资源
      最近更新 更多