Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询:从PostgreSQL中删除具有相同值的行_Sql_Postgresql_Duplicates_Sql Delete - Fatal编程技术网

SQL查询:从PostgreSQL中删除具有相同值的行

SQL查询:从PostgreSQL中删除具有相同值的行,sql,postgresql,duplicates,sql-delete,Sql,Postgresql,Duplicates,Sql Delete,我有一个数据库,在其中我成功地获得了一些重复的行 数据库包含以下值: -------------------------------------------------------------- | id | did | sensorid | timestamp | data | db_timestamp | -------------------------------------------------------------- | int | string | int

我有一个数据库,在其中我成功地获得了一些重复的行

数据库包含以下值:

--------------------------------------------------------------
| id  | did    | sensorid | timestamp | data  | db_timestamp |
--------------------------------------------------------------
| int | string | int      | bigint    | jsonb | bigint       |
--------------------------------------------------------------
时间戳
db_时间戳
是unix时间戳(自1970年1月1日12:00:00 AM起的毫秒)

我已经设法得到了许多重复的值,我需要一个快速的方法来“丢弃”它们。显示它们重复的值是
did
sensorid
时间戳
。这意味着,如果我找到一行,其中这些是相同的,那么它们是重复的

我做了以下查询以查找重复项,现在我只需要了解如何删除它们

SELECT did, sensorid, timestamp, COUNT(*)
FROM <db_name>
GROUP BY did, sensorid, timestamp
HAVING COUNT(*) > 1
ORDER BY sensorid, timestamp;
我知道did可以是一个
bigint
或类似的工具来提高性能,但不这样做是有原因的

我想删除所有重复的行,但重要的是保留其中一行,理想情况下是具有最低行
id
的行,这将是“原始”行


我希望这里的人能帮我创建这样一个查询。

使用带有行号()的CTE来标识要删除的id,然后删除它们

with CTE as
(
select t1.*, row_number() over(partition by did, sensorid order by id) as rn
from MyTable t1
)
delete
from MyTable 
where id in (select id from CTE where rn > 1)

OP似乎没有唯一的
id
列,该列可用于区分重复项(或对重复项进行排序)。(在第二个视图中:他似乎有它,但他没有列出它…)每一行都有一个唯一的id。我想我忘了提到这一点。id列为串行(自动递增整数)
with CTE as
(
select t1.*, row_number() over(partition by did, sensorid order by id) as rn
from MyTable t1
)
delete
from MyTable 
where id in (select id from CTE where rn > 1)