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:
我有 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
的每个唯一组合一行替换现有的 tableCREATE 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: