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

时间:2018-08-27 17:09:38

标签: sql postgresql

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

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)

我在这里想念什么?

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

从stdtextproducts中删除a    存在     (选择 *     从stdtextproducts b     其中a.hdrtime = b.hdrtime     和b.ctid

如果这不起作用,您确定除了hrdtime之外这里是否没有其他KEY?