Sql 从数据表中删除特定重复行的查询

Sql 从数据表中删除特定重复行的查询,sql,google-bigquery,subquery,data-manipulation,Sql,Google Bigquery,Subquery,Data Manipulation,我有一个intervals数据表,每次触发一个事件时,它都会得到一个事件的日期戳和开始时间,当该事件结束时,它会得到另一个包含结束时间的id相同的行 我的桌子是这样的: | | datestamp | interval_uid | start_time | end_time | |---|-----------|--------------|------------|----------| | 1 | 10:37 | 1 | 10:37 | null

我有一个intervals数据表,每次触发一个事件时,它都会得到一个事件的日期戳和开始时间,当该事件结束时,它会得到另一个包含结束时间的id相同的行

我的桌子是这样的:

|   | datestamp | interval_uid | start_time | end_time |
|---|-----------|--------------|------------|----------|
| 1 | 10:37     | 1            | 10:37      | null     |
| 2 | 10:38     | 2            | 10:38      | null     |
| 3 | 10:41     | 1            | 10:37      | 10:41    |
我想设置一个计划查询,删除有另一个重复间隔的行和没有结束时间的行。以下是table1处理查询的方式:

|   | datestamp | interval_uid | start_time | end_time |
|---|-----------|--------------|------------|----------|
| 1 | 10:38     | 2            | 10:38      | null     |
| 2 | 10:41     | 1            | 10:37      | 10:41    |
目前,我通过此查询选择了不需要的行,并将其保存到表2

SELECT
  a.*
FROM
  `table1` a
JOIN (
  SELECT
    interval_uid,
    COUNT(*)
  FROM
    `table1`
  GROUP BY
    interval_uid
  HAVING
    COUNT(*) > 1) b
ON
  a.interval_uid = b.interval_uid
WHERE
  duration IS NULL --or end_time IS NULL
我可以通过这个查询可视化我想要的表

SELECT *
FROM `table1`
EXCEPT DISTINCT
SELECT *
FROM `table_2`

是否可以在一个查询中安排所有这些,以便每天从表1中删除所有不需要的行?

使用聚合如何

select datestamp, interval_uid, start_time, max(end_time) as end_time
from t
group by datestamp, interval_uid, start_time;
您可以直接将其保存到单独的表中

编辑:

要删除行,请执行以下操作:

delete from t
    where t.end_time is null and
          exists (select 1
                  from t t2
                  where t2.datestamp = t.datestamp and
                        t2.interval_uid = t.interval_uid and
                        t2.start_time = t.start_time and
                        t2.end_time is not null
                 );

实现这一点的另一种方法是使用当前查询并覆盖现有表,而不是使用删除语句

正如您所提到的,您正在使用2个查询来获取所需的数据,基于此,您计划的查询可以如下所示:

WITH table1 as (
    SELECT
    a.*
    FROM
    table1 a
    JOIN (
    SELECT
        interval_uid,
        COUNT(*)
    FROM
        table1
    GROUP BY
        interval_uid
    HAVING
        COUNT(*) > 1) b
    ON
    a.interval_uid = b.interval_uid
    WHERE
    duration IS NULL --or end_time IS NULL
)

SELECT *
FROM table1
EXCEPT DISTINCT
SELECT *
FROM table2
在此之后,在创建计划查询时,可以将设置为表


请记住,DELETE是一个DML语句,当前每个表有1000个操作。

我需要删除表中的行,而不是创建另一个表。此外,我只显示了4个字段,但实际上有14个字段,其中重复的行上只有间隔uid和开始时间重合。@Abutreca。您的问题对于
delete
不清楚,因为您只显示
select
查询。它们只是显示我想要什么的示例。我在文中解释说,我想从我拥有的表中删除行。这是一种可能性,但不是优化得很差,每天覆盖一个100k+行的表,而不是只删除几行?如果要使用delete语句,还需要使用聚合查询所有表以检测重复项,也许这篇文章会有帮助