• [技术解读] GaussDB数据库SQL系列-自定义函数
    一、前言华为云GaussDB数据库是一款高性能、高安全性的云原生数据库,在GaussDB中,自定义函数是一个不容忽视的重要功能。本文将简单介绍一下自定义函数在GaussDB中的使用场景、使用优缺点、示例及示例解析等,为读者提供指导与帮助。二、自定义函数(Function)概述在SQL中,自定义函数(Function)是一种用于执行特定任务并返回结果的可重复使用代码块。Function可以接受参数,并且可以返回指定的结果等。 在GaussDB中,Function是数据库管理和开发人员的重要“工具”。通过Function,可以封装复杂的逻辑,以简化数据处理流程并提高工作效率。三、使用场景数据库中Function的使用场景包含但不限于以下,例如:数据处理:可以用于处理数据,如对字符串进行拆分、合并、替换、转换大小写等操作;对日期和时间进行格式化、计算时间差等操作;对数值进行计算、四舍五入、取整等操作;对布尔值进行逻辑操作等。聚合操作:可以用于对数据进行聚合操作,如计算平均值、总和、最大值、最小值等。条件判断:可以用于进行条件判断,如判断某个值是否满足特定条件,并返回相应结果。实现代码的重用和抽象:可以用于实现代码的重用,从而减少程序员编写重复代码的工作量,也可以用于实现代码的抽象。四、优缺点1、数据库中Function的使用优点执行速度快:只在创建时进行编译,以后每次执行都不需要再重新编译,而一般SQL语句每执行一次就要编译一次,因此使用函数可以提高数据库执行速度。操作简便:可以封装复杂的数据库操作,只需要一个函数调用就可以完成相应的操作,从而简化了数据库操作。可重用性高:可以重复使用,减少了数据库开发人员的工作量。提高系统安全性:可以设定只有特定用户才具有对指定函数的使用权,增强了数据库的安全性。2、数据库中Function的使用缺点调试困难:与SQL语句相比,函数在调试过程中更加困难。可移植性差:在不同的数据库系统中,函数的使用和语法可能有所不同,因此函数的可移植性较差。五、GaussDB中的Function示例与解析常见Function操作(创建、调用、删除等)1、示例一:定义函数为SQL查询--定义函数为SQL查询CREATE FUNCTION func_add_sql(integer, integer) RETURNS integerAS 'select $1 + $2;'LANGUAGE SQLIMMUTABLERETURNS NULL ON NULL INPUT;--调用SELECT func_add_sql(1,9);--DROPDROP FUNCTION func_add_sql;调用结果:解析说明:这段代码是在创建一个名为'func_add_sql'的SQL函数,这个函数接受两个整数作为输入参数,并返回它们的和。“CREATE FUNCTION”:这是一个SQL命令,用于创建新的函数。“func_add_sql”:这是创建的函数的名称。“RETURNS integer”:这指定了函数的返回类型为整数。“IMMUTABLE”:这是一个特性,表明这个函数总是返回相同的结果,当给定相同的输入时。也就是说,这个函数不依赖于任何外部状态或数据,它的结果不会变化。“RETURNS NULL ON NULL INPUT”:表明如果任何一个输入参数为NULL,函数将返回NULL。“LANGUAGE SQL”:这指定了函数用SQL语言编写。“'select $1 + $2;'”:这是函数的主体。$1和$2是参数引用,分别代表输入的两个参数。2、示例二:返回一个包含多个输出参数的记录--返回一个包含多个输出参数的记录。CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text)AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$LANGUAGE SQL;--调用SELECT * FROM func_dup_sql(10);--DROPDROP FUNCTION func_dup_sql;调用结果:解析说明:这个函数名为func_dup_sql,它接受一个输入参数(标记为in),并产生两个输出(标记为f1和f2)。函数体内部使用 $$ 标记代码块,里面是一个SELECT语句,它返回输入参数$1的两个不同形式的值。对于f1,它直接返回输入的整数值。对于f2,它将输入的整数值转换为一个文本字符串,并在其后添加字符串' is text'。这个转换是使用CAST函数完成的,它将$1从整数值转换为文本字符串。这个函数的语言是SQL,这表示它是在SQL的上下文中执行的。总的来说,这个函数接受一个整数作为输入,然后返回两个值:一个整数和一个由整数生成并添加了文本后缀的字符串。3、示例三:返回RECORD类型结果集--返回RECORD类型CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint)returns SETOF RECORDas $$beginresult_1 = i + 1;result_2 = i * 10;return next;end;$$ language plpgsql;--调用SELECT compute(10);--DROPDROP FUNCTION compute;调用结果:解析说明:这是一个GaussDB数据库兼容PL/pgSQL自定义函数的定义。此函数名为compute,它接受一个整数参数i,并返回一个记录集,其中包含两个字段:result_1和result_2,它们都是大整数类型(bigint)。在函数的主体中,定义了以下操作:“result_1 = i + 1;”:将参数i加1后的结果赋值给result_1。“result_2 = i * 10;”:将参数i乘以10的结果赋值给result_2。“return next;”:返回结果集中的下一行。由于这个函数只返回了一行,所以这行将在第一次调用时返回。“$$ language plpgsql;”: 声明这个函数的编程语言是兼容PL/pgSQL。当调用这个函数时,你可以传入一个整数参数,它将返回一个结果集,其中包含一个记录,其result_1字段的值为输入的整数加1,result_2字段的值为输入的整数乘以10。六、小结总的来说,在GaussDB中,函数是一种强大且灵活的工具,它能帮助数据库管理和开发人员更有效地处理和操作数据,提高工作效率,并在数据查询、数据转换、数据过滤等场景中发挥出更大的作用。当然了,关于GaussDB数据库,除了上面的例子还有很多实践,例如:创建package属性的重载函数、通过语法“ALTER FUNCTION function_name …”修改函数、通过语法“DROP FUNCTION [ IF EXISTS ] function_name …”删除函数等,欢迎大家参考官网资料进行学习、测试!——结束
  • [技术解读] GaussDB数据库SQL系列-SQL与ETL浅谈
    一、前言在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽取(Extract)、转换(Transform)和加载(Load)。但这些其实都脱离不了数据库系统,本节主要从GaussDB数据库生态出发,给大家简单讲一下SQL 与 ETL的过程与关系。二、SQL与ETL的概述SQL(结构化查询语言)SQL是一种用于管理关系数据库系统的标准编程语言(例如、MySql、GaussDB等)。它用于查询、插入、更新和删除数据库中的数据。SQL语言主要用于数据库管理系统的交互,它并不是一种通用的编程语言,而是专门设计用于操作关系数据库的。ETL(Extract-Transform-Load)ETL是一个过程,用于从源系统提取数据,将其转换为目标系统所需的格式,然后将其加载到目标系统库。ETL是数据集成的一部分,用于将分散的、不一致的数据整合到一起,然后通过统一的接口将数据传输到目标系统库进行分析和应用。ETL是数据库处理数据的重要环节,当在ETL过程中使用SQL时,通常涉及如下图操作。三、ETL过程中的SQL示例(GaussDB)本章节涉及到的SQL适用于GaussDB等数据库。1、提取(Extract)在ETL过程中,抽取是将数据从源系统中获取并传输到目标系统的第一步。这可能涉及到连接到数据库、读取文件、调用API等操作。在抽取数据时,需要考虑以下几个方面:数据源的选择:根据具体业务需求选择数据源,并考虑数据量、数据质量、数据类型等因素。抽取方式的选择:可以选择增量、全量更新等不同的抽取方式。数据抽取的调度:需要考虑时间、频率、并发等因素,以确保数据的及时性和准确性。常用SQL语句示例:1)全量(表)提取SELECT * FROM source_table;2)增量提取(例如,根据日期字段,按天、月、年提取,或其他维度)SELECT * FROM source_table WHERE t_date=’20230907’;Tip:根据业务需求提取全字段或者指定字段。2、转换(Transform)在ETL过程中,转换是对抽取的数据进行清洗、转换、过滤和格式化等操作,以满足目标系统的需求。转换的主要操作包括:数据清洗:包括去重、填充缺失值、异常值处理等操作,以确保数据的质量和准确性。数据转换:包括数据类型转换、字段计算、格式化等操作,以使数据符合目标系统的数据结构和数据类型。常用SQL语句示例:1)数据行去重 --数据行去重(随机保留或者优先保留)SELECT order_id, user, product, numberFROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY proctime ASC) as row_numFROM Orders)WHERE row_num = 1;参数说明:ROW_NUMBER(): 从第一行开始,依次为每一行分配一个唯一且连续的号码。PARTITION BY col1[, col2...]: 指定分区的列,例如去重的键。ORDER BY time_attr [asc|desc]: 指定排序的列。升序( ASC )排列指只保留第一行,而降序排列( DESC )则指保留最后一行。WHERE rownum = 1: 取ROW_NUMBER()生成的编号1。可参考上一篇文章:cid:link_02)字段清洗(例如:去空格)通过TRIM()、REPLACE()、CASE WHEN … THEN … END等关键字或函数进行异常字符处理。--清洗空格SELECT length(' 去空格 '),length(TRIM(' 去空格 ')),length(REPLACE(' 去空格 ',' ','')),length(CASE WHEN ' 去空格 ' <>'去空格' THEN '去空格' END);说明:Trim(),通过去空格函数进行清洗Replace(), 通过替换清洗case when … then …end 与字典表比对进行清洗,此处的与字典表比对省略,具体根据业务需求进行。3)非法日期清洗创建日历表calendar,存储19000101到30001231的所有日期,通过比对判断是否为合规的日期格式。--与字典表比对SELECT *,CASE WHEN create_date NOT IN (SELECT c_date FROM calendar) THEN 0 ELSE 1 END status FROM T1--剔除所有非法日期行DELETE FROM T1 WHERE status =0;Tip: 上文写法适合GaussDB等关系型数据库,且都是比较基础的示意说明,具体需要根据业务需要进行编写。3、加载(Load)在ETL过程中,加载是将转换后的数据加载到目标系统中,通常是数据仓库或数据集市。加载的主要操作包括:数据映射。将转换后的数据映射到目标系统中,包括表、字段等。数据加载。将转换后的数据加载到目标系统中,并进行数据校验、数据整合等操作。常用SQL语句示例:1)增量表(累加,字段、表一 一映射)INSERT INTO target_table (column1, column2, column3) SELECT column1, column2, column3 FROM source_table;2)全量表(全删全插,字段、表一 一映射)--情况目标表TRUNCATE table target_table;--全量插入INSERT INTO target_table (column1,column2,…) SELECT column1,column2,… FROM source_table;3)作业重跑,清空指定分区数据,重新加载--清理表分区的数据--清空分区etl_dateALTER TABLE orders TRUNCATE PARTITION etl_date;--或者清空分区etl_date=20230911。ALTER TABLE orders TRUNCATE PARTITION for (20230911);--插入新数据INSERT INTO target_table (column1,column2,…,etl_date) SELECT column1,column2,…,etl_date FROM source_table;Tip:数据加载涉及到的算法及表设计非常复杂,例如,涉及历史拉链表(关链、开链)、全量表(全删全插)、增量表(累加)等。设计时需要从数仓/数据集市的全局架构出发,确保合理、准确、高效等。四、附DataArts Studio介绍华为云GaussDB相关的生态工具DataArts Studio数据治理中心是一个强大的ETL工具和技术,它可以帮助开发人员设计、编写和管理ETL脚本。以下是DataArts Studio在这些方面的主要功能和优势:可视化的ETL设计:DataArts Studio提供了一个直观的可视化界面,使开发人员能够以图形化方式设计和配置ETL流程。通过拖放组件和连接线,开发人员可以轻松定义数据提取、转换和加载的步骤,而无需编写复杂的代码。内置的数据转换和处理功能:DataArts Studio提供了丰富的内置转换和处理组件,如数据清洗、数据格式转换、数据合并、数据计算等。开发人员可以直接使用这些组件,而无需自行编写转换逻辑,从而加快开发速度并减少错误。强大的数据连接和集成能力:DataArts Studio支持与各种数据源的连接和集成,包括关系型数据库、文件系统、云存储、API接口等。开发人员可以轻松地配置数据源连接,并直接从这些数据源中提取数据。可扩展的脚本编写和管理:虽然DataArts Studio提供了可视化的ETL设计界面,但它也支持自定义脚本编写。开发人员可以使用内置的脚本编辑器编写自定义的ETL脚本,以满足特定的需求。此外,DataArts Studio还提供了ETL脚本的版本控制和管理功能,方便团队协作和脚本的维护。实时监控和调试:DataArts Studio提供了实时监控和调试功能,开发人员可以实时查看ETL流程的执行状态、数据处理的结果和错误信息。这有助于快速发现和解决问题,提高ETL脚本的质量和可靠性。五、小结SQL与ETL的关系在于,SQL语言通常用于ETL过程中的数据提取和转换阶段。通过使用SQL查询语句,可以从源数据库中提取所需的数据,然后使用SQL语句对数据进行必要的转换和处理,以便将其加载到目标系统。当然了,现在好多企业都有专门的ETL工具,但其实后台都是通过类似“PYTHON + SQL”、“PERL + SQL”等方式实现的,其重点在于ETL过程中的SQL处理。 同样,在GaussDB数据库生态中也是不可或缺的,掌握GaussDB数据库相关的SQL写法必不可少。——结束
  • [技术解读] GaussDB的角色
     通过GRANT把角色授予用户后,用户即具有了角色的所有权限。推荐使用角色进行高效权限分配。例如,可以为设计、开发和维护人员创建不同的角色,将角色GRANT给用户后,再向每个角色中的用户授予其工作所需数据的差异权限。在角色级别授予或撤消权限时,这些更改将作用到角色下的所有成员。       GaussDB提供了一个隐式定义的拥有所有角色的组PUBLIC,所有创建的用户和角色默认拥有PUBLIC所拥有的权限。关于PUBLIC默认拥有的权限请参考GRANT。要撤销或重新授予用户和角色对PUBLIC的权限,可通过在GRANT和REVOKE指定关键字PUBLIC实现。       要查看所有角色,请查询系统表PG_ROLES:创建、修改和删除角色非三权分立时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有初始用户和具有CREATEROLE属性的用户才能创建、修改或删除角色。要创建角色,请使用CREATE ROLE。要在现有角色中添加或删除用户,请使用ALTER ROLE。要删除角色,请使用DROP ROLE。DROP ROLE只会删除角色,并不会删除角色中的成员用户账户。内置角色提供了一组默认角色,以gs_role_开头命名。它们提供对特定的、通常需要高权限的操作的访问,可以将这些角色GRANT给数据库内的其他用户或角色,让这些用户能够使用特定的功能。在授予这些角色时应当非常小心,以确保它们被用在需要的地方。表1描述了内置角色允许的权限范围:关于内置角色的管理有如下约束:以gs_role_开头的角色名作为数据库的内置角色保留名,禁止新建以“gs_role_”开头的用户/角色/模式,也禁止将已有的用户/角色/模式重命名为以“gs_role_”开头;禁止对内置角色的ALTER和DROP操作;内置角色默认没有LOGIN权限,不设预置密码;gsql元命令\du和\dg不显示内置角色的相关信息,但若显示指定了pattern为特定内置角色则会显示。三权分立关闭时,初始用户、具有SYSADMIN权限的用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。三权分立打开时,初始用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。
  • [问题求助] 存一些比较大的txt文件到GaussDB中,请问用CLOB性能好,还是BLOB性能好
    存一些比较大的txt文件到GaussDB中,请问用CLOB性能好,还是BLOB性能好
  • [问题求助] GaussDB归档后的数据怎么查询
    GaussDB归档后的数据怎么查询
  • [问题求助] GaussDB能否通过配置,自动对数据进行归档
    GaussDB能否通过配置,自动对数据进行归档
  • [问题求助] GaussDB数据量比较大的话,是否也需要像mysql一样去做分区分库
    GaussDB数据量比较大的话,是否也需要像mysql一样去做分区分库
  • [问题求助] GaussDB有没有AES、3DES这种对称加密的原生函数
    GaussDB有没有AES、3DES这种对称加密的原生函数
  • [问题求助] GaussDB 有没有计算MD5的函数
    GaussDB 有没有计算MD5的函数
  • [GaussTech] 【分享集赞回帖赢好礼】LLVM技术在GaussDB等数据库中的应用
    让技术触达每一个角落,赋能更多的人华为云数据库现推出【分享回帖赢好礼】活动在这里你可以呼朋引伴,一起来集赞也可以谈天论地,成为技术咖参与方式任你选快来邀你的小伙伴一起参加吧~活动时间:2024/5/28-6/17参与方式:方式1:呼朋引伴,来集赞步骤一:转发技术文《LLVM技术在GaussDB等数据库中的应用》到朋友圈,20人点赞;步骤二:将集赞的分享页截图, 在本帖下方盖楼互动;下方评论区回帖:华为云账号+朋友圈分享页面截图方式2:谈天论地,你是技术咖基于《LLVM技术在GaussDB等数据库中的应用》技术文,发表您的看法,在本帖下方进行提问或评论均可。注:以上2个参与方式,盖楼评奖相互独立(前提,方式2的有效回帖条数≥20),否则两种参与方式一起开奖;参与方式1截图回帖的用户,每个ID有效盖楼数量≤3条,超过3条的以前3条为准;开奖条件,有效盖楼数量≥100。活动奖励:奖励奖励及规则:1、盖楼≥100层,有效楼层数的5%、15%、25%、35%、45%、55%、65%、85%、95% 将会获得GaussDB字母笔/炫彩马卡龙指甲刀;2、盖楼>100层&盖楼≤200层,每增加10个楼层,增加一个抽奖名额,有效楼层数的1%、11%、21%、31%、41%、51%、61%、71%、81%、91%将会获得奖品新贵族系列中性笔/平装套芯笔记本;3、盖楼>200层&盖楼≤300层,每增加10个楼层,增加一个抽奖名额,有效楼层数的5%、10%、20%、30%、40%、50%、60%、70%、80%、90%,将会获得华为云定制短袖/卫衣;4、盖楼>300层,每增加20个楼层,增加一个抽奖名额,有效楼层数的10%、30%、50%、80%、90%将会获得HUAWEI mini蓝牙音箱_绮境森林/《华为数据之道》书籍;5、盖楼>400层,将随机抽取一名幸运用户,有效楼层数的88%将会获得华为定制背包一个;注:总有效楼层数乘以指定中奖百分比后,四舍五入,确定最终获奖楼层;例如:若总楼层数为199,中奖楼层为21%,199x 21%= 41.79,则四舍五入后中奖楼层为42楼。获奖楼层重复,按最高奖品进行发放,不重复奖励参与规则:1. 同一ID可参与两种活动方式,但两种方式各自的有效盖楼数量≤3次;2. 同一ID自问自答算一条有效盖楼;活动注意事项:1、请务必按照上述要求提交内容,灌水/无效/违规的内容不参与活动奖励;2、禁止复制他人内容,如发现根据发布时间优先的人获得奖励;3、活动结束后十五个工作日内公布积分排名情况及获奖名单,届时请及时关注并填写奖品收件信息;4、本活动最终解释权归华为云所有。
  • [技术解读] GaussDB主备机
    主备环境可以支持主备从和一主多备两种模式。主备从模式下,备机需要重做日志,可以升主,而从备只能接收日志,不可以升主。而在一主多备模式下,所有的备机都需要重做日志,都可以升主。主备从主要用于大数据分析类型的系统,能够节省一定的存储资源。而一主多备提供更高的容灾能力,更加适合于大批量事务处理的OLTP系统。主备之间可以通过switchover进行角色切换,主机故障后可以通过failover对备机进行升主。初始化安装或者备份恢复等场景中,需要根据主机重建备机的数据,此时需要build功能,将主机的数据和WAL日志发送到备机。主机故障后重新以备机的角色加入时,也需要build功能将其数据和日志与新主拉齐。另外,在在线扩容的场景中,需要通过build来同步元数据到新节点上的实例。Build包含全量build和增量build,全量build要全部依赖主机数据进行重建,拷贝的数据量比较大,耗时比较长,而增量build只拷贝差异文件,拷贝的数据量比较小,耗时比较短。一般情况下,优先选择增量build来进行故障恢复,如果增量build失败,再继续执行全量build,直至故障恢复。为了实现所有实例的高可用容灾能力,除了以上对DN设置主备多个副本,还提供了其他一些主备容灾能力,比如CN(互为备份)、GTM(一主多备)、CM Sever(一主多备)以及ETCD(一主多备)等,使得实例故障后可以尽可能快地恢复,不中断业务,将因为硬件、软件和人为造成的故障对业务的影响降到最低,以保证业务的连续性。
  • [问题求助] 在日志里面发现大量的连接数据库端口的error
    业务倒是不中断,在openGauss日志里面发现大量的连接数据库端口的error,想请问一下怎么回事呢
  • [技术解读] 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_numFROM 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_numFROM customer) tWHERE 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_numberFROM(SELECT t.*FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY name,id_type,id_number ORDER BY tel_number ASC) as row_numFROM customer) tWHERE t.row_num = 1) t1LEFT JOIN(SELECT *FROM customerWHERE source ='车险' and is_car IS NOT NULL AND is_house IS NOT NULL AND marital_status IS NOT NULL) t2ON t1.name =t2.nameand t1.id_type=t2.id_typeand t1.id_number=t2.id_number说明:t1 表是优先保留含有手机的记录行(去重),并作为主表,t2表是需要补齐的字段来源表。两张表通过“姓名+证件类型+证件号码”进行关联,然后合并需要的信息。6、附:全字段去重在数据库应用时,例如,重复误操作、数据翻倍等原因造成的全字段重复,此时也要进行去重。 那除了前面介绍的3种方式外,大家还可以使用关键字DISTINCT、UNION 进行去重,但需要注意其数据量及SQL 性能。 (大家自行测试)1) DISTINCT (假设全部有如下三个字段)2) UNION(假设全部有如下三个字段)四、数据去重效率提升建议最好的去重其实是在数据源头就进行“拦截”。当然了, 因业务流转也不可能完全避免,但是我们可以提高去重的效率:选择合适的去重算法根据数据集的特点和规模,选择适合的去重算法,可以大大提高去重效率。优化数据存储结构采用合适的数据存储结构,如哈希表、B+树等,可以加快数据的查找和比较速度,从而提高去重效率。并行化处理采用并行化处理的方式,将数据集分成多个子集,分别进行去重处理,最后合并结果,可以大大加快去重速度。使用索引加速查找对数据集中的关键字段建立索引,可以加速查找和比较速度,从而提高去重效率。前置过滤采用前置过滤的方式,先对数据集进行一些简单的筛选和处理,如去除空值、去除无效字符等,可以减少比较次数,从而提高去重效率。去重结果缓存(临时表)对去重结果进行缓存,可以避免重复计算,从而提高去重效率。不建议重写(备份)涉及一些分区表,等不建议直接将去重后的结果集重写到生产表,创建临时换成,或进行备份后操作。五、总结数据去重涉及到的面非常广,包括重复数据的发现、去重规则的定义、去重的方法与效率、去重的困难与挑战等等。但是,去重原则只有一个,那就是以业务为导向。根据业务需求去定义重复数据、制定去重规则和方案。在GaussDB数据库的使用过程,我们同样会遇到去重的场景。本文从应用背景、案例、去重方案等方面给大家做了介绍,欢迎测试、交流。——结束
  • [技术解读] 【酷哥说库|GaussDB微动画】GaussDB数据库两地三中心异地容灾解决方案
    videoGaussDB数据库提供的两地三中心异地容灾解决方案,可以实现数据库故障后快速恢复,能够保证极端灾难情况下数据的安全性和可用性,今天酷哥就带大家了解一下~
  • [技术解读] 【酷哥说库|GaussDB微动画】GaussDB数据库透明数据加密
    videoGaussDB数据库的透明数据加密技术,对数据库中存储的数据进行加密,以保护敏感信息免受未经授权的访问,从而保护数据。今天酷哥带大家了解一下~
总条数:1667 到第
上滑加载中