• 技术文章 >数据库 >PostgreSQL

    postgresql表如何去重

    yangyang2020-04-08 13:35:42原创4525

    去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。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=#

    推荐:PostgreSQL教程

    专题推荐:postgresql
    上一篇:为什么使用postgresql 下一篇:postgresql使用索引吗

    相关文章推荐

    • postgresql初始化失败• postgresql如何查看(point类型变量)坐标系• postgresql日志放在哪里

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网