GP查询并删除重复数据问题

在数据库中做增删查改时,难免会因为误操作导致数据库中存在一些重复数据,那么如何定位这些重复数据并且删除呢?本文将介绍在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 "
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值