Google BigQuery:如何在没有任何额外列的情况下从 table 中删除重复行

Google BiqQuery: How delete dublicate rows from table without any extra colum

我有 table 两列,其中有重复项:

select record_id,
       session_id,
       count(record_id) as total_duplicate_records
from `project.dataset.table` 
group by 1,2
order by 3 desc

输出如下:

我看到一个类似的问题:BigQuery Standard SQL: Delete Duplicates from Table 但是一个基于一些额外列的答案被用来作为决胜局。就我而言,没有这样的专栏...

目标是 运行 每天一次删除所有重复记录的计划查询

您可以使用 SELECT DISTINCT 删除您的 table。

CREATE OR REPLACE TABLE
    `project.dataset.table` -- this will overwrite your table
AS

SELECT DISTINCT
    record_id,
    session_id
FROM
    `project.dataset.table`

新建一个table

将要替换或创建的table替换为新名称。这将创建一个新的 table。 运行 再次查询将 recreate/overwrite 新的 table.

CREATE OR REPLACE TABLE
    `project.dataset.table_deduped` -- change to a new table
AS

SELECT DISTINCT
    record_id,
    session_id
FROM
    `project.dataset.table`

一些潜在的缺点:

  • 您存储了两次数据。 (重复和去重 tables)
  • 每次在原始 table 中获取新数据时都必须重新创建 table,但是您可以不重新创建它,而是通过 merge statement[= 插入新数据39=]

创建 VIEW

视图是基于查询的虚拟 table。数据未存储在新的 table 中。您查询它的方式与查询 table 的方式相同。如果基础 table 或 tables 得到更新并且您总是想要最新的 'view' 数据,这可能很有用。

CREATE VIEW
    `project.dataset.table_deduped` -- change to a new table
AS

SELECT DISTINCT
    record_id,
    session_id
FROM
    `project.dataset.table`

使用 cte table (WITH clause)

创建一个您可以在同一查询中引用的临时 table。

WITH 
    deduped_table AS (
        SELECT DISTINCT
            record_id,
            session_id
        FROM
            `project.dataset.table`
)

SELECT 
    *
FROM 
    deduped_table

所有选项都各有利弊。取决于你想要实现什么,你的数据是如何构建的,以及你需要多关心你的数据量querying/storing。如果你只有这两列,那可能没什么大不了的,但无论如何我都需要注意你的选择。

你可以使用这样的东西。它将用 record_id 和 session_id

的每个唯一组合一行替换现有的 table
CREATE OR REPLACE TABLE
  `project.dataset.table`
AS
SELECT
  record_id, session_id
FROM
  `project.dataset.table`
GROUP BY 1,2

输入Table:

如果所有行的所有字段都是重复的,可以考虑下面的方法

select as value any_value(t)
from `project.dataset.table1` t
group by format('%t', t)

输出:

要将其与 DDL 一起使用,您可以考虑以下方法:

create or replace table `project.dataset.table2` as
select * from (
 select as value any_value(t)
 from `project.dataset.table1` t
 group by format('%t', t)
);

输出Table: