SQL 查询 : Deleting rows from PostgreSQL with same values

标签 sql postgresql duplicates sql-delete

<分区>

我有一个数据库,其中我设法获得了一些重复的行。

数据库包含以下值:

--------------------------------------------------------------
| id  | did    | sensorid | timestamp | data  | db_timestamp |
--------------------------------------------------------------
| int | string | int      | bigint    | jsonb | bigint       |
--------------------------------------------------------------

timestampdb_timestamp 是 unix 时间戳(自 1970 年 1 月 1 日 12:00:00 AM 以来的毫秒数)

我设法获得了很多重复值,我需要一种快速“丢弃”它们的方法。显示它们重复的值是 didsensoridtimestamp。这意味着如果我找到相同的行,那么它们就是重复的。

我已经进行了以下查询来查找重复项,现在我只需要了解如何删除它们。

SELECT did, sensorid, timestamp, COUNT(*)
FROM <db_name>
GROUP BY did, sensorid, timestamp
HAVING COUNT(*) > 1
ORDER BY sensorid, timestamp;

我的数据库包含将近 1.200.000.000 行并且我知道这些重复项太多了,因此我创建了一个 python 脚本来为我删除它们。然而,我设法发现使用我的 python 脚本并没有我需要的那么快,因此我希望使用 SQL 查询删除我的重复项可以凑合。

这是我上述查询的打印输出:

----------------------------------------------------
|       did       | sensorid |  timestamp  | count |
|"358188056470108"|    910   |1492487704000|  61   |
|"358188056470108"|    910   |1492487705000|  61   |
----------------------------------------------------

我知道可以使用 bigint 或类似的方法来提高性能,但有理由不这样做。

我想删除所有重复项,但重要的是我要保留其中一行,最好是 id 最低的行,这将成为“原始”行。

我希望这里有人可以帮助我创建这样的查询。

最佳答案

使用带有 row_number() 的 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)

关于SQL 查询 : Deleting rows from PostgreSQL with same values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45958431/

相关文章:

sql - 使用存储过程作为 "dynamic" View ?

java - 如何使用 PostgreSQL DB 插入当前日期和时间并以特定格式检索它?

javascript - 重复代码检测 : Tools you can use

python - 如何在 python pandas 中显示重复的 ID 和重复的数据

c++ - SQLite 更新 100 毫秒

php - 如何防止 PHP 中的 SQL 注入(inject)?

c# - 使用和交易

postgresql - 使 ST_Distance 查询在高负载下可扩展?

linux - 如何通过 Linux 脚本检查是否安装了 PostgreSQL?

MYSQL:查找并删除相似记录 - 使用示例进行更新