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

在数据库中做增删查改时,难免会因为误操作导致数据库中存在一些重复数据,那么如何定位这些重复数据并且删除呢?本文将介绍在Greenplum数据库中如何实现查询并删除重复数据的方法。

目录

    • PostgreSQL与Greenplum的关系
    • GP查询重复数据
      • 1. row_number()函数
      • 2. having函数
    • PostgreSQL删除重复数据
        • ctid是什么?
        • 流程
        • 示例代码
    • GP删除重复数据
        • 发生了报错:
        • 解决方案:
        • 代码:
    • GP判断重复数据
    • 总结

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 "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)

PostgreSQL删除重复数据

在介绍GP如何删除重复数据之前,首先我们来看PostgreSQL作为GP的大哥,是如何实现这一功能的。
原理:利用ctid区分重复数据。

ctid是什么?

在展示具体代码之前,我先简单介绍下ctid是什么,以便初学者理解为何可以通过ctid实现这一功能。
这里引用一下postgresql的ctid中对于ctid的定义:

ctid表示数据行在它所处的表内的物理位置,ctid字段的类型是tid。尽管ctid可以快速定位数据行,每次vacuum
full之后,数据行在块内的物理位置就会移动,即ctid会发生变化,所以ctid不能作为长期的行标识符,应该使用主键来标识一个逻辑行。

根据此定义不难发现,ctid有能够起到一定的数据标识符的作用,但在某些特定的场景下,它也不是那么可靠,这为后续GP实现删除功能埋下了重要伏笔。

流程

1)查询要删除的数据——上文已介绍
2)重复的数据保留其中的一行——利用min(ctid)或者max(ctid)
3)删除其余的数据

示例代码

delete from emp where ctid not in (select min(ctid) from emp group by id);

GP删除重复数据

本文的重头戏来了,按照惯有思路,我们可以一脉相承postgre的思路和代码,这里先卖个关子,我们不妨试试看如果这么做会发生什么。

发生了报错:

在这里插入图片描述
这条报错信息里也给了错误提示和修改建议,大概意思是只用ctid无法得到唯一的数据行(实际上我已经加了一些其他的字段以保证是唯一的数据行,但gp会把这个语句识别为语法错误而非逻辑错误)。
在解决之前,不妨先思考一下为什么会出现这种情况:因为GP是分布式并行数据库!分布式意味着同一张表上的数据会由于你设置的分布键的不同而存储在不同的segment上,那么根据ctid的定义很可能某些在不同segment上的数据由于在其segment上面的相对位置相同,所以会拥有相同的ctid,这时就会出现报错中提到的问题——仅用ctid无法确保得到的是unique row。
对此我们可以进行验证:
在这里插入图片描述
同一个ctid在一张表里查出了多行完全不同的数据,验证了我们之前的猜想。

解决方案:

加入gp_segment_id字段与ctid结合共同定位数据行.

代码:

可能有更简洁的写法,此处仅提供一种可以实现的代码供参考。

delete from table_name
where (gp_segment_id, ctid)in(
select gp_segment_id, ctid from(
select gp_segment_id,ctid,*,row_number() over (partition by col1, col2, col3, col4) as rn
from  table_name
where (col1, col2, col3, col4) in(select  col1, col2, col3, col4from phm.phmot_crm_ordergroup by col1, col2, col3, col4having count (*) > 1)
order by gp_segment_id, ctid
) as df1
where rn > 1
order by gp_segment_id
);

GP判断重复数据

当然解决问题最好从问题的源头进行解决,避免在同一张表中插入重复数据可以减少我们需要删除重复数据的需求,在gp乃至postgresql中用如下方式可避免重复插入数据:

--先给表创建一个唯一性约束
alter table 表名 add constraint 约束名 unique(goods_id, user_id, enterprise_id);INSERT INTO 表名 ( sku, goods_id, user_id, enterprise_id, create_date, create_user_id )
VALUES(222, 14851, 1154, 1263,2020-04-16 20:26:32, 1153 )
ON CONFLICT ON CONSTRAINT 约束名 DO NOTHING;

总结

本文介绍了GP数据库实现查询和删除重复数据的几种方案以及原理,相信读者们通过此案例可以对分布式数据库以及底层数据库和衍生的数据库的异同点有了初步的感知。

参考文献:
PostGresql------- 通过sql查找重复数据代码实例
Greenplum企业应用实战(笔记):第五章 执行计划详解
PostgreSQL删除重复数据
pgSQL 判断重复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39266.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 查找字符串重复字符和只出现一次的字符

#include <iostream> #include <string>using namespace std;int main() {string temp "";cout << "请输入字符串&#xff1a;";getline(cin,temp);string str ""; //存放只出现一次的字符string str1 ""; //存…

chatgpt赋能python:Python排除字符串中重复字符

Python排除字符串中重复字符 在处理字符串数据时&#xff0c;我们经常需要对字符串中的重复字符进行处理&#xff0c;以便更好地对数据进行分析和处理。在Python编程领域中&#xff0c;有许多方法可以用于排除字符串中的重复字符&#xff0c;从而使数据更加清晰和有用。在本文…

拼音打字时不定时出现重复字母

问题自述&#xff1a; 家里面有一台备用机惠普15-R239TX&#xff0c;东西放久了发现键盘缝隙里面很脏&#xff0c;得空就拆机后彻底清理了一下。 自从上次清理过键盘后&#xff0c;在使用Q Q拼音打字时会不定时出现重字母的情况&#xff0c;重新下载最新版本&#xff0c;默认设…

CPM-Bee本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

3分钟部署私人chat-gpt教程

一、注册vercel账号 点击 Vercel 邮箱注册一个号&#xff0c;86的手机号也能注册。需要github账号和openai key 二、创建项目 1. 在首页新建项目 2. 登录你的github账号&#xff0c;然后创建一个仓库 导入第三方的仓库 输入&#xff1a;https://github.com/Yidadaa/ChatGPT…

注册AppStore开发者账号以及收款设置的流程详解(2019最新版)

最近和朋友倒腾了一个APP&#xff0c;想在App Store上架&#xff0c;因此就在注册个人开发者账号的过程中踩了不少坑。 申请App Store的开发者账号果然不是一件容易的事情&#xff0c;并且我发现在设置收款时尤其容易踩坑。期间&#xff0c;我也看了不少分享&#xff0c;但由于…

苹果 company开发者账号注册流程图解分享

苹果开发者账号的注册过程还是比较复杂的&#xff0c;周期拉了一个月&#xff08;漫长啊~~&#xff09;。和大家分享一下过程和细节&#xff0c;以免大家走了弯路。本文由萌虾米492405648编写蛮辛苦的要是对你有用是我最大的欣慰啦 一定要记住申请的过程中遇到问题致电苹果开发…

最新苹果商务管理ABM注册及使用

本文了解苹果商务管理Apple Business Manager(简称ABM)的申请注册流程及应用下载方式 苹果商务管理&#xff0c;Apple Business Manager 简称ABM&#xff0c;用于 定制应用分发公司/组织内部应用分发 如果你的应用是上边两种类型就考虑用ABM分发了&#xff0c;这类应用的特点是…

年度最新!iOS如何申请苹果公司开发者账号流程详细图文介绍

苹果官方参考文章&#xff1a;使用 Apple Developer App 注册和管理您的帐。 申请公司账号&#xff0c;别申请个人账号。以前有家公司就申请错了申请为个人账号了&#xff0c;结果只能显示个人开发者的名字。个人账号和公司账号费用现在一样了。企业账号已经不能申请了。申请网…

iOS 苹果企业账号申请流程

申请需要用到的一些资料&#xff1a;.一张可以付美元的信用卡(如VISA或万事达)、一个企业邮箱账号还有公司的营业执照复印件(申请邓白氏码的时候需要用到)。 1.打开网址https://developer.apple.com&#xff0c;如下图&#xff1a; 2.点击上图中的Account&#xff0c;进入登录页…

发布苹果App有哪些步骤流程

前提&#xff1a; 1.需要一台苹果电脑 2.需要苹果开发者账号 3.已经开发好的App 发布步骤&#xff1a; 1.先创建App ID 登录开发者账号选择Certificates, Identifiers & Profiles进入相应的界面&#xff0c;再选择Identifiers旁边的蓝色&#xff0b;号 然后选择App IDs…

最新2016年苹果公司开发者帐号申请流程

对于刚申请完苹果开发者账号的我来说&#xff0c;我们需要区分一下个人账号、公司账号和企业账号这三种&#xff0c;还有一种是教育账号&#xff0c;这个就不多说了。 个人账号&#xff1a;个人申请用于开发苹果app所使用的账号&#xff0c;仅限于个人使用&#xff0c;申请比较…

最新Apple苹果开发者账号AppleID注册流程

1、登陆开发者官网&#xff1a; https://developer.apple.com/ 2、如果有苹果设备&#xff0c;可以直接使用你设备的appleID&#xff0c;后面的步骤一样的&#xff0c;这是少了这个注册过程。下面说说没有appleID的注册流程。 点击开发者官网右上角account,进入开发者登陆页…

IOS 企业级苹果开发者账号申请流程

今天在公司的技术交流群里交流苹果企业级账号的申请&#xff0c;受大家鼓励&#xff0c;将几个月前申请流程整理了一下&#xff0c;现在想来申请苹果账号不可怕&#xff0c;只是申请的流程信息过于琐碎。 由于笔者刚踩完坑&#xff0c;与苹果客服交流了一个多月&#xff0c;搜索…

2016年最新苹果开发者账号注册申请流程最强详解!

转自&#xff1a;http://www.niaogebiji.com/article-9882-1.html 准备工作&#xff1a;一张visa或者万事达国际信用卡&#xff08;开通visa或master功能的信用卡&#xff09;、公司邮箱、公司网站&#xff08;需与邮箱后缀一致&#xff09;。苹果企业开发者账号&#xff0c;分…

【iOS】【最新】2023苹果开发者账号注册流程(公司类型)

一 Apple Developer 申请开发者账号 Apple Developer 点击 Account 创建 Apple ID 最好新注册一个新的&#xff0c;专门用做开发。 需要注意的是 开发者的名字和 ID 想好在填写 &#xff0c;注册成功后&#xff0c;不能自己修改&#xff0c;需要修改的话只能联系苹果客服。…

苹果开发者账号注册流程

下面就开始注册苹果ID并且通过交纳99美元&#xff0c;来获取一个官方授权的证书以便于你发布你的应用程序到IPHONE. 对于中国开发人员&#xff0c;打开如下图链接: http://developer.apple.com/programs/register/ 如果你已经拥有一个苹果ID&#xff0c;也可以不注册&#xff0…

【iOS】【最新】2023苹果开发者账号注册流程

文章目录 苹果开发者账号个人开发者账号公司开发者账号&#xff1a;企业开发者账号&#xff1a; 1、申请APPID2、申请邓白氏码&#xff08;个人开发者账号不需要&#xff09;3、提交公司相关信息注&#xff1a;邓白氏码申请&#xff0c;已更新流程&#xff0c;不是直接回复邮件…

2015年最新苹果开发者账号注册流程详解

苹果开发者账号的注册过程比较复杂&#xff0c;和大家分享一下过程和细节&#xff0c;以免大家走了弯路。 1.登陆苹果开发者官网页面 https://developer.apple.com/programs/ios/ 2.点击“enroll now $99/year”按钮&#xff08;如下图&#xff09; 3.在弹出的介绍页面中点击按…

IOS 苹果公司开发者账号注册申请流程

去年做了一下公司的苹果开发者账号&#xff0c;根据经验写了份注册流程&#xff0c;留档备忘。 From:叶客笑 <放浪神加护> 前期准备工作&#xff1a; 之前没有进行过苹果开发者账号注册的苹果ID&#xff0c;并确保此ID开启了双重验证。 用于注册的ID姓名在申请期间需…