【发布时间】:2018-02-08 01:13:26
【问题描述】:
我有一个数据库,我设法在其中获取了一些重复的行。
数据库包含以下值:
--------------------------------------------------------------
| id | did | sensorid | timestamp | data | db_timestamp |
--------------------------------------------------------------
| int | string | int | bigint | jsonb | bigint |
--------------------------------------------------------------
timestamp 和 db_timestamp 是 unix 时间戳(自 1970 年 1 月 1 日凌晨 12:00:00 以来的毫秒数)
我已经设法获得了很多重复的值,我需要一种快速的方法来“丢弃”它们。向我显示它们重复的值是did、sensorid 和timestamp。这意味着如果我找到一个相同的行,那么它们就是重复的。
我已经进行了以下查询来查找重复项,现在我只需要找出如何删除它们。
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 |
----------------------------------------------------
我知道 did 可能是 bigint 或类似名称以提高性能,但不这样做是有原因的。
我想删除所有重复项,但重要的是我保留其中一行,最好是最低行 id 的行,这将是“原始”行。
希望这里有人可以帮我创建这样的查询。
【问题讨论】:
标签: sql postgresql duplicates sql-delete