Sql 从数据表中删除特定重复行的查询
我有一个intervals数据表,每次触发一个事件时,它都会得到一个事件的日期戳和开始时间,当该事件结束时,它会得到另一个包含结束时间的id相同的行 我的桌子是这样的: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
| | 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语句,还需要使用聚合查询所有表以检测重复项,也许这篇文章会有帮助