GaussDB数据库SQL系列-数据去重
目录
一、前言
数据去重在数据库中是比较常见的操作。复杂的业务场景、多业务线的数据来源等等,都会带来重复数据的存储。本文以GaussDB数据库为实验平台,将为大家详细讲解如何去重。
二、数据去重应用场景
- 数据库管理(含备份):在数据库中进行数据去重可以避免数据重复存储、备份,提高数据库的存储效率、降低备份的存储成本。
- 数据集成:在数据集成的过程中,需要合并多个数据源的数据,去重可以避免重复的数据对合并结果的影响。
- 数据分析(或挖掘):在进行数据分析或数据挖掘时,去重可以避免重复的数据对分析或挖掘结果的干扰,提高分析的准确性。
- 电商平台:在电商平台上进行商品去重可以避免重复上架相同的商品,提高平台的用户体验。
- 金融风控:在金融风控领域,去重可以避免重复的数据对风控模型的影响,提高风控的准确性。
三、数据去重案例(GaussDB)
实战业务场景 + GaussDB数据库
1、示例场景描述
以保险行业的客户信息除重为例,为防止坐席重复联系客户(容易造成客户投诉),需要将客户进行唯一身份识别。存在以下两种情况,需要将其识别成一个人(唯一),这时候就需要进行数据去重的动作。
- 情况一:同一个客户有不同的来源渠道:客户即购买了寿险、又购买了产险(两个不同的来源系统);
- 情况二:同一个客户多次回流:客户在同一个渠道多次购买(续保或者购买同一险种的不同产品)。
2、定义重复数据
通过“姓名+证件类型+证件号”将其识别为一个人,即只要这三个字段重复,就认为这些数据行为重复数据。 (当然还有更复杂的场景,例如,“姓名+证件类型+证件号+手机号+车牌号”等,本次不做详细介绍)。
3、制定去重规则
1)多选一
- 随机:根据去重规则,随机保留一条数据。
- 优先级:根据去重规则 + 业务逻辑,保留优先需要的一条数据。例如优先保留“是否有房、是否有车”。
2)多合一
- 将重复数据合并成一条数据,合并规则根据业务逻辑确定。
4、创建测试数据(GaussDB)
客户信息字段主要包含“姓名、性别、出生年月日、证件类型、证件号、来源、是否有车、是否有房、婚姻状态、手机号、……”等信息。
--创建客户信息表 CREATE TABLE customer( name VARCHAR(20) ,sex INT ,birthday VARCHAR(10) ,ID_type INT ,ID_number VARCHAR(20) ,source VARCHAR(10) ,IS_car INT ,IS_house INT ,marital_status INT ,tel_number VARCHAR(15) ); --插入测试数据 INSERT INTO customer VALUES('张三','1','1988-01-01','1','61010019880101****','寿险','1','1','1',''); INSERT INTO customer VALUES('张三','1','1988-01-01','1','61010019880101****','车险','1','0','1',''); INSERT INTO customer VALUES('张三','1','1988-01-01','1','61010019880101****','','','','','186****0701'); INSERT INTO customer VALUES('李四','1','1989-01-02','1','61010019890102****','寿险','1','1','1',''); INSERT INTO customer VALUES('李四','1','1989-01-02','1','61010019890102****','车险','1','0','1',''); INSERT INTO customer VALUES('李四','1','1989-01-02','1','61010019890102****','','','','','186****0702'); --查看结果 SELECT * FROM customer;
Tip: 部分为INT类型的字段值取字典表的值,此处省。
5、编写去重方法(GaussDB)
以下示例中不包含过多的数据清洗、数据脱敏、业务逻辑等的处理,这些步骤均建议进行“前置”处理。本次示例重点描述去重的过程。
1)随机保留:根据业务逻辑,随机保留一条记录。
SELECT * FROM (SELECT * ,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ) as row_num FROM customer) WHERE row_num = 1;
说明:
- ROW_NUMBER(): 从第一行开始,依次为每一行分配一个唯一且连续的编号。
- PARTITION BY col1[, col2...]: 指定分区的列,例如去重的键“姓名、证件类型、证件号码”。
- WHERE row_num = 1:取ROW_NUMBER()生成的编号1。
2)按优先级保留:根据业务逻辑,优先保留有手机号的一条记录,如果有多条记录含有手机号或有没有手机号,则在此基础上随机保留。
--保留含有手机号的记录行 SELECT t.* FROM (SELECT * ,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ORDER BY tel_number ASC) as row_num FROM customer) t WHERE t.row_num = 1;
说明:
- ROW_NUMBER(): 从第一行开始,依次为每一行分配一个唯一且连续的号码。
- PARTITION BY col1[, col2...]: 指定分区的列,例如去重的键“姓名、证件类型、证件号码”。
- ORDER BY col [asc|desc]: 指定排序的列。升序( ASC )排列指只保留第一行,而降序排列( DESC )则指保留最后一行。
- WHERE row_num = 1:取ROW_NUMBER()生成的编号1。
3)合并保留:根据业务逻辑,合并完整性高、准确性高的字段信息。例如优先将含有手机号的记录行进行补齐,需要补齐的字段有“是否有车、是否有房、婚姻状况”,其取值是来源为“车险”的对应记录。
--合并保留 SELECT t1.name ,t1.sex ,t1.birthday ,t1.id_type ,t1.id_number ,t1.source ,t2.is_car ,t2.is_house ,t2.marital_status ,t1.tel_number FROM (SELECT t.* FROM (SELECT * ,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ORDER BY tel_number ASC) as row_num FROM customer) t WHERE t.row_num = 1) t1 LEFT JOIN (SELECT * FROM customer WHERE source ='车险' and is_car IS NOT NULL AND is_house IS NOT NULL AND marital_status IS NOT NULL) t2 ON t1.name =t2.name and t1.id_type=t2.id_type and t1.id_number=t2.id_number
说明:
t1 表是优先保留含有手机的记录行(去重),并作为主表,t2表是需要补齐的字段来源表。两张表通过“姓名+证件类型+证件号码”进行关联,然后合并需要的信息。
6、附:全字段去重
在数据库应用时,例如,重复误操作、数据翻倍等原因造成的全字段重复,此时也要进行去重。 那除了前面介绍的3种方式外,大家还可以使用关键字DISTINCT、UNION 进行去重,但需要注意其数据量及SQL 性能。 (大家自行测试)
1) DISTINCT (假设全部有如下三个字段)
2) UNION(假设全部有如下三个字段)
四、数据去重效率提升建议
最好的去重其实是在数据源头就进行“拦截”。当然了, 因业务流转也不可能完全避免,但是我们可以提高去重的效率:
- 选择合适的去重算法:根据数据集的特点和规模,选择适合的去重算法,可以大大提高去重效率。
- 优化数据存储结构:采用合适的数据存储结构,如哈希表、B+树等,可以加快数据的查找和比较速度,从而提高去重效率。
- 并行化处理:采用并行化处理的方式,将数据集分成多个子集,分别进行去重处理,最后合并结果,可以大大加快去重速度。
- 使用索引加速查找:对数据集中的关键字段建立索引,可以加速查找和比较速度,从而提高去重效率。
- 前置过滤:采用前置过滤的方式,先对数据集进行一些简单的筛选和处理,如去除空值、去除无效字符等,可以减少比较次数,从而提高去重效率。
- 去重结果缓存(临时表):对去重结果进行缓存,可以避免重复计算,从而提高去重效率。
- 不建议重写(备份):涉及一些分区表,等不建议直接将去重后的结果集重写到生产表,创建临时换成,或进行备份后操作。
五、总结
数据去重涉及到的面非常广,包括重复数据的发现、去重规则的定义、去重的方法与效率、去重的困难与挑战等等。但是,去重原则只有一个,那就是以业务为导向。根据业务需求去定义重复数据、制定去重规则和方案。在GaussDB数据库的使用过程,我们同样会遇到去重的场景。本文从应用背景、案例、去重方案等方面给大家做了介绍,欢迎测试、交流。
——结束

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
边缘计算AI智能安防监控视频平台车辆违停算法详解与应用
随着城市车辆保有量呈现高速增长趋势,交通拥堵、违章行为也日益泛滥。因为车辆未停放在指定区域导致的车位浪费、占用/堵塞交通要道、车辆剐蹭等问题层出不穷。通过人工进行违法停车的监控,不仅让监控人员工作负荷越来越大,而且存在发现不及时、监管效率低和人工成本高等各种问题。 随着人工智能技术的发展成熟与日益落地应用,利用机器视觉代替人工视觉对监控区域进行检测与识别,对区域内的车辆目标进行提取、对违停行为自动判定、自动车牌识别,可以准确、快速地对机动车违停行为进行检测、抓拍、取证、告警,还可以并结合声光报警器设备对违停行为进行及时有效的劝离提醒。 TSINGSEE青犀视频智能分析网关内置的车辆违停AI识别算法,可支持检测机动车、电瓶车等车型的违停行为,结合ROI划定,可手动将指定区域划为禁停区,并对其中的载具进行识别与标注。当算法检测到禁停区域出现车辆违停现象,便会立刻在系统后台进行事件上报并告警,通知管理人员及时处理违停行为。 边缘计算AI智能分析网关的识别算法精度可达90%以上,支持对机动车属性进行提取与识别,如车辆颜色、车辆型号、品牌等;支持车牌识别,包括识别车辆的车牌信息,如车牌号,车牌...
- 下一篇
多云系列|10个关键的多云战略:简介
随着VMware继续向客户介绍多云问题以及VMware跨云服务在云智能计算历程中的优势,有一个问题经常被提及,"我如何开始?"。本博客系列旨在为客户提供指导,并回顾多云的十大领域,介绍我们应该关注哪些方面。此外,我们还将通过demos、工具和其他资源来帮助你。在我们开始第一个话题之前,让我们回顾一下多云、跨云服务和云智能的历程。 有87%的企业使用两个及以上的云服务,拥有多云战略对保持企业竞争力至关重要。随着企业开始发展多云服务(无论是通过并购、对特定云原生服务的需求,还是开发者的偏好),孤岛式的运营、成本的增加,以及开发者速度和IT控制程度之间的矛盾与权衡也开始出现。 大约十年前,当各企业开始尝试公有云时,人们倾向于云优先(Cloud First)。这个阶段的重点是建立面向客户的应用,通常是在单一的云中。他们开始看到在公有云中创建现代化应用的好处,以及将应用更快地推向市场的能力,来获取竞争优势。这第一波云创新推动了应用的创新和飞速发展。然而,经调查和证实,对大多数客户来说,控制管理这些应用和底层基础设施是一个难题。 在对VMware客户的调查中,许多人将他们目前的状态描述为云混乱C...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路