从 postgres 数据库中删除重复条目

Posted

技术标签:

【中文标题】从 postgres 数据库中删除重复条目【英文标题】:Deleting duplicate entries from postgres database 【发布时间】:2018-08-27 17:09:37 【问题描述】:

我在尝试从我的数据库中删除多个非常相似但不完全相同的条目时遇到了一些麻烦。我看过这里和许多其他解决方案:

Delete Duplicate Records in PostgreSQL

How to delete duplicate rows with SQL?

每次我尝试从表中删除多个重复项时,该命令都会删除所有条目,而不仅仅是删除重复项。

这是带有重复样本的表格,我们应该只保留一个唯一的 hdrtime:

SELECT * from stdtextproducts where xxxid='DEN' AND nnnid='MTR' and hdrtime='270600';
 cccid |  datacrc   | hdrtime | nnnid | site | wmoid  | xxxid | bbbid |       inserttime        |                                 product                                  |    reftime    
-------+------------+---------+-------+------+--------+-------+-------+-------------------------+--------------------------------------------------------------------------+---------------
 DEN   | 3680361181 | 270600  | MTR   | KDEN | SAUS70 | DEN   | RRF   | 2018-08-27 05:55:51.811 | SAUS70 KDEN 270600 RRF                                                  +| 1535349351811
       |            |         |       |      |        |       |       |                         | METAR KDEN 270553Z 22017KT 10SM BKN150 OVC200 23/06 A2991 RMK AO2 PK WND+| 
       |            |         |       |      |        |       |       |                         |      22026/0456 SLP028 T02330056 10289 20222 58004                       | 
 DEN   | 1538417601 | 270600  | MTR   | KDEN | SAUS70 | DEN   | RRM   | 2018-08-27 05:57:57.356 | SAUS70 KDEN 270600 RRM                                                  +| 1535349477356
       |            |         |       |      |        |       |       |                         | METAR KDEN 270553Z 22017KT 10SM BKN150 OVC200 23/06 A2991 RMK AO2 PK WND+| 
       |            |         |       |      |        |       |       |                         |      22026/0456 SLP028 T02330056 10289 20222 58004                       | 
(2 rows)

我尝试了以下方法:

DELETE FROM stdtextproducts a USING (SELECT MIN(ctid) as ctid, hdrtime FROM stdtextproducts GROUP BY hdrtime HAVING COUNT(*) > 1) b WHERE a.hdrtime = b.hdrtime AND a.ctid <> b.ctid;

还有以下内容:

DELETE FROM stdtextproducts WHERE reftime NOT IN (SELECT MAX(reftime) FROM stdtextproducts GROUP BY hdrtime);

我应该期望只有一个条目会出现在列表中,但似乎所有条目都不再存在了。

SELECT * from stdtextproducts where xxxid='DEN' AND nnnid='MTR' and hdrtime='270600';
 cccid | datacrc | hdrtime | nnnid | site | wmoid | xxxid | bbbid | inserttime | product | reftime 
-------+---------+---------+-------+------+-------+-------+-------+------------+---------+---------
(0 rows)

我在这里错过了什么?

提前致谢。

【问题讨论】:

DELETE FROM stdtextproducts WHERE reftime NOT IN (SELECT MAX(reftime) FROM stdtextproducts b GROUP BY stdtxtproducts.hdrtime=b.hdrtime) 只是猜测 【参考方案1】:

尝试如下

  DELETE FROM stdtextproducts a where
   a.ctid<>   
    (SELECT MIN(b.ctid) as ctid
    FROM stdtextproducts b
    where a.hdrtime=b.hdrtime  
    ) 

   DELETE FROM stdtextproducts T1 
   USING   stdtextproducts  T2
    WHERE   T1.ctid < T2.ctid  -- delete the older versions
    AND T1.hdrtime= T2.hdrtime ;  -- add more columns if needed

【讨论】:

我尝试了第一个选项,但耗时太长。第二个选项删除表中的所有内容。哦,T1.DEN 应该是 T1.xxxid 列。 @RayY 对于第二个选项,您需要键连接,是的,第一个太慢了 感谢它现在正在工作,对于其他从谷歌寻找解决方案的人来说,我已经稍微调整了你的第二种方法,并提出了以下可行的方法:从 stdtextproducts 中删除 a 使用 stdtextproducts b WHERE a。 ctid 【参考方案2】:
DELETE FROM stdtextproducts a where
   exists 
    (SELECT *
    FROM stdtextproducts b
    where a.hdrtime=b.hdrtime 
    and b.ctid<a.ctid
    ) 

如果这不起作用,你确定这里除了hrdtime?之外没有另一个KEY

【讨论】:

以上是关于从 postgres 数据库中删除重复条目的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Postgres 数据库中删除用户 [重复]

从 Mac 中删除旧的 Postgres 版本 [重复]

表“令牌”的缺少FROM子句条目

删除时键“PRIMARY”的重复条目“0”(codeigniter)

Python中可变数据的重复数据删除/合并

Logstash RSS Feed(重复数据删除并提取某些数据)