在数据库中做增删查改时,难免会因为误操作导致数据库中存在一些重复数据,那么如何定位这些重复数据并且删除呢?本文将介绍在Greenplum数据库中如何实现查询并删除重复数据的方法。
目录
PostgreSQL与Greenplum的关系
众所周知,Greenplum是通过postgresql的底层实现的,所以postgresql中90%的语法都可以在greenplum中实现,但是GP数据库的特点也是其最津津乐道的优点是其为分布式并行数据库。大家应该都听过很多关于分布式的优点、好处等,不过作为初学者,这个概念还是过于抽象,乍一听感觉没什么,使用起来也只是在建表的时候更注重distributed by key而已,但实际上分布式的表结构就注定了GP要实现某些功能就注定要与Postgre背道而驰,尤其是在表结构本身的问题上,这个现象会在下文中得到具体的展示。
GP查询重复数据
GP查询重复数据方面和Postgre的底层逻辑是一致的,且有许多种方法,主要思想即为利用每行数据的唯一标识(可以是一列也可以是多列)进行查询并计数,数量大于1的数据即为重复数据。具体实现方法这里仅作简单地介绍。
1. row_number()函数
利用row_number() over(partition by col1, col2) as rn
语句可以轻松对数据进行分类聚合后计数,再筛选rn > 1的数据即为重复数据(关于此函数的介绍详情请看本人PL/pgSQL自学之路系列文章)。
2. having函数
此方法有点即为与postgre查询重复数据方法高度一致,也为后续删除重复数据奠定一定基础,缺点是对于多列作为数据唯一标识的情况下语句稍显复杂,下面将分别展示单列、多列作为unique id时,利用having函数查重的具体语句:
1)单列作为unique id时
select "POSITION_NAME","CMEMO","SUPERINTENDENT_MAN_NAME","SUPERINTENDENT_MAN_NAME"
from "DCS_RISK"
where "ID" in (select "ID" from "DCS_RISK" group by "ID" having count ("ID") > 1)
2)多列作为unique id时
select "