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)