【问题标题】:SQL Query: Deleting rows from PostgreSQL with same values [duplicate]SQL查询:从PostgreSQL中删除具有相同值的行[重复]
【发布时间】:2018-02-08 01:13:26
【问题描述】:

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

数据库包含以下值:

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

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

我已经设法获得了很多重复的值,我需要一种快速的方法来“丢弃”它们。向我显示它们重复的值是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   |
----------------------------------------------------

我知道 did 可能是 bigint 或类似名称以提高性能,但不这样做是有原因的。

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

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

【问题讨论】:

    标签: sql postgresql duplicates sql-delete


    【解决方案1】:

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

    【讨论】:

    • 看来 OP 没有唯一的 id 列,可用于区分重复项(或对它们进行排名)。 (第二种观点:他似乎确实拥有它,但他没有列出它......)
    • 每一行都有一个唯一的ID。我想我忘了提到这一点。 id列是一个序列号(自动递增整数)
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2020-02-17
    相关资源
    最近更新 更多