仅存储1个值,并删除bigquery中相同重复值的其余值

7lrncoxx  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(339)

我的数据中有重复的值。但是,从重复的值中,我只想存储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个值并删除其余值):

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

6uxekuva

6uxekuva1#

考虑到你的截图样本数据和你的解释。我知道您希望从只保留一行唯一数据的表中删除重复项。因此,我可以创建一个查询,只选择一行数据,而忽略重复的数据。
为了选择没有任何重复的行,可以使用SELECTDISTINCT。根据文档,它会丢弃任何重复的行。除此方法外,CREATETABLE语句还将用于创建一个新表(或替换上一个表),其中包含不重复的新数据。语法如下:

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或replace,这意味着如果您将project_id.dataset.table设置为与select中的表相同的路径,它将替换当前表(以防数据来自一个唯一的表)。否则,它将使用指定的新表名创建一个新表。

41ik7eoe

41ik7eoe2#

可以使用聚合。像这样:

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/ 日期 combination, this returns an arbitrary matching row from/ b`。

相关问题