postgresql表如何去重

suliver發表於2021-09-11

postgresql表如何去重

去重的方法一般是找到重複資料中的一條,以某一唯一條件去掉其他重複值。PostgreSQL 庫如何去除單表重複資料呢?可以透過 ctid 進行,下面我們就來看一下PostgreSQL去重的方法。

一、建立測試表

david=# create table emp (
david(# id int,
david(# name varchar);
CREATE TABLE
david=#

二、插入測試資料

david=# insert into emp values (1, 'david');
INSERT 0 1
david=# insert into emp values (1, 'david');
INSERT 0 1
david=# insert into emp values (1, 'david');
INSERT 0 1
david=# insert into emp values (2, 'sandy');
INSERT 0 1
david=# insert into emp values (2, 'sandy');
INSERT 0 1
david=# insert into emp values (3, 'renee'); 
INSERT 0 1
david=# insert into emp values (4, 'jack');  
INSERT 0 1
david=# insert into emp values (5, 'rose'); 
INSERT 0 1
david=#

三、查詢初始化資料

david=# select ctid, * from emp;
 ctid  | id | name  
-------+----+-------
 (0,1) |  1 | david
 (0,2) |  1 | david
 (0,3) |  1 | david
 (0,4) |  2 | sandy
 (0,5) |  2 | sandy
 (0,6) |  3 | renee
 (0,7) |  4 | jack
 (0,8) |  5 | rose
(8 rows)

david=#

查詢重複資料數

david=# select distinct id, count(*) from emp group by id having count(*) > 1;
 id | count 
----+-------
|     3
|     2
(2 rows)

david=#

查詢出 id 為1的記錄有3條,id 為2的記錄有2條。

四、查詢要保留的資料

以 min(ctid) 或 max(ctid) 為準。

david=# select ctid, * from emp where ctid in (select min(ctid) from emp group by id);
 ctid  | id | name  
-------+----+-------
 (0,1) |  1 | david
 (0,4) |  2 | sandy
 (0,6) |  3 | renee
 (0,7) |  4 | jack
 (0,8) |  5 | rose
(5 rows)

david=#

五、刪除重複資料

david=# delete from emp where ctid not in (select min(ctid) from emp group by id);
DELETE 3
david=#

六、檢視最後結果

david=# select ctid, * from emp;
 ctid  | id | name  
-------+----+-------
 (0,1) |  1 | david
 (0,4) |  2 | sandy
 (0,6) |  3 | renee
 (0,7) |  4 | jack
 (0,8) |  5 | rose
(5 rows)

david=#

推薦:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2833958/,如需轉載,請註明出處,否則將追究法律責任。

相關文章