SQL 查询:从 PostgresSQL 中删除具有相同值的行
SQL Query: Deleting rows from PostgreSQL with same values
我有一个数据库,其中我设法获得了一些重复的行。
数据库包含以下值:
--------------------------------------------------------------
| id | did | sensorid | timestamp | data | db_timestamp |
--------------------------------------------------------------
| int | string | int | bigint | jsonb | bigint |
--------------------------------------------------------------
timestamp
和 db_timestamp
是 unix 时间戳(自 1970 年 1 月 1 日 12:00:00 AM 以来的毫秒数)
我已经设法获得了很多重复的值,我需要一个快速的方法来 "discarding" 它们。向我表明它们重复的值是 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 |
----------------------------------------------------
我知道确实可以 bigint
或类似的方法来提高性能,但有理由不这样做。
我想删除所有重复项,但重要的是我保留其中一行,最好是具有最低行 id
的行,然后将成为 "original" 行.
我希望这里有人可以帮助我创建这样的查询。
使用带有 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)
我有一个数据库,其中我设法获得了一些重复的行。
数据库包含以下值:
--------------------------------------------------------------
| id | did | sensorid | timestamp | data | db_timestamp |
--------------------------------------------------------------
| int | string | int | bigint | jsonb | bigint |
--------------------------------------------------------------
timestamp
和 db_timestamp
是 unix 时间戳(自 1970 年 1 月 1 日 12:00:00 AM 以来的毫秒数)
我已经设法获得了很多重复的值,我需要一个快速的方法来 "discarding" 它们。向我表明它们重复的值是 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 |
----------------------------------------------------
我知道确实可以 bigint
或类似的方法来提高性能,但有理由不这样做。
我想删除所有重复项,但重要的是我保留其中一行,最好是具有最低行 id
的行,然后将成为 "original" 行.
我希望这里有人可以帮助我创建这样的查询。
使用带有 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)