MySQL 8 数据清洗总结

MySQL 8 数据清洗三要素:

  • 库表拷贝和数据备份
  • 数据清洗SQL
  • 数据清洗必杀技-存储过程

前提:数据库关联库表初始化和基础数据初始化:

-- usc.t_project definition

CREATE TABLE `t_project` (
  `id` varchar(64) NOT NULL COMMENT '主键',
  `tid` varchar(64) NOT NULL COMMENT 'TID',
  `ptid` varchar(64) NOT NULL COMMENT 'PTID',
  `project_no` varchar(64) DEFAULT NULL COMMENT '项目编号',
  `project_name` varchar(128) NOT NULL COMMENT '项目名称',
  `project_address` varchar(128) NOT NULL COMMENT '项目地址',
  `is_delete` int NOT NULL DEFAULT '0' COMMENT '删除标识:0=未删除,1=已删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `t_project_id_IDX` (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- usc.t_arch definition

CREATE TABLE `t_arch` (
  `tid` varchar(64) NOT NULL COMMENT 'TID',
  `ptid` varchar(64) NOT NULL COMMENT 'PTID',
  `id` varchar(64) NOT NULL COMMENT '主键',
  `project_id` varchar(64) NOT NULL COMMENT '项目ID',
  `project_no` varchar(100) NOT NULL COMMENT '项目编号',
  `arch_name` varchar(128) NOT NULL COMMENT '案卷名称',
  `arch_no` varchar(128) NOT NULL COMMENT '案卷编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

 上述库表的关系:1:N = 项目 :案卷

-- 项目基础数据
INSERT INTO usc.t_project (id,tid,ptid,project_no,project_name,project_address,is_delete) VALUES
	 ('1','430100','430000','1001','长沙国金中心','长沙市芙蓉区', 0),
	 ('2','430100','430000','1001','长沙国金中心','长沙市芙蓉区', 0);
-- 案卷基础数据
INSERT INTO usc.t_arch (tid,ptid,id,project_id,project_no,arch_name,arch_no) VALUES
	 ('430100','430000','1','1','1001','案卷一','案卷一'),
	 ('430100','430000','2','2','1002','案卷二','案卷二'),
	 ('430100','430000','3','2','1002','案卷三','案卷三');

库表拷贝和数据备份

在MySQL 8 客户端 执行如下命令:

-- 复制t_project 表结构
create table t_project_2023_08_29 like t_project;

-- 拷贝t_project 表的数据至t_project_2023_08_29
insert into t_project_2023_08_29 select * from t_project

-- t_arch 执行如下命令, 注意替换相关表名
create table t_arch_2023_08_29 like t_arch ;

insert into t_arch_2023_08_29 select * from t_arch

数据清洗SQL

数据清洗的五要素:

  • 确定数据清洗的筛选条件
  • 确定数据清洗的数据记录
  • 确定数据清洗的过滤条件
  • 确定数据清洗的更新字段
  • 数据清洗后的核验

实战:昨天晚上帮朋友写了一个Shell 脚本迁移******城建档案馆历史数据。今天跟我反馈迁移的历史项目信息存在重复情况,导致项目关联的案卷出现了缺失情况。

按照数据清洗的5要素一步步的来复盘,如何编写项目关联案卷的清洗SQL:

1、确定数据清洗的筛选条件:

select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1 

此SQL功能含义:查询项目表以Tid\Ptid\Project_no 字段分组且数量大于1 的项目信息 。

上述截图标识:项目表存在重复记录的情况.

 2、确定数据清洗的数据记录:

select * from  t_arch ta
inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
on ta.tid = temp.tid and ta.ptid = temp.ptid and ta.project_no = temp.project_no

此SQL功能含义:使用内联模式查询案卷表和项目表【条件添加:数据清洗的筛选条件】 。

上述截图标识:案卷表需要进行数据清洗的记录数.

 3、确定数据清洗的过滤条件

一般情况下过滤条件为:查询记录字段与关联从表关联字段。

select * from  t_arch ta
inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
on ta.tid = temp.tid and ta.ptid = temp.ptid and ta.project_no = temp.project_no
where ta.project_id in (
	select tp.id from t_project tp where tp.tid = temp.tid and tp.ptid = temp.ptid and tp.project_no = temp.project_no
)

此SQL功能含义:使用查询字段temp.tid\temp.ptid\temp.project_no 关联从表t_project,查询满足主表t_arch 关联的project_id。

上述截图标识:案卷表需要进行数据清洗的记录数并添加了相关条件进行筛选。

4、 确定数据清洗的更新字段

案卷表需要更新project_id 字段,同时将Select 语句修改为Update 语句。

update t_arch ta
inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
on ta.tid = temp.tid and ta.ptid = temp.ptid and ta.project_no = temp.project_no
set ta.project_id = (select min(tp.id) from t_project tp where tp.tid = temp.tid and tp.temp.ptid and tp.project_no = temp.project_no group by  tp.tid, tp.ptid, tp.project_no limit 1)
where ta.project_id in (
	select tp.id from t_project tp where tp.tid = temp.tid and tp.ptid = temp.ptid and tp.project_no = temp.project_no
)

重点:从表存在重复的情况,一般推荐使用:min/max函数 + group by +limit  +筛选主表关联字段,查询出满足条件的从表字段进行Set。

(select min(tp.id) from t_project tp where tp.tid = temp.tid and tp.temp.ptid and tp.project_no = temp.project_no group by  tp.tid, tp.ptid, tp.project_no limit 1)

5、数据清洗后的核验

select * from  t_arch ta
inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp

此SQL功能含义:核查数据的清洗记录情况。

 上述截图标识:与数据清洗筛选记录截图,我们明显发现project_id 字段已经全部替换为 1,但是数据核查的清洗记录SQL 还能查询出相关数据,但是t_arch 表管理的project_id 字段又是正确的因为t_project 表的数据还没有进行清洗。

数据清洗拓展

以下SQL 主要涉及T_Project 表数据的清洗

update t_project ta
	inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
	on ta.tid = temp.tid and ta.ptid = temp.ptid and ta.project_no = temp.project_no
	set ta.is_delete = 1
	where ta.id not in (
		select min_id from (select min(tp.id) as min_id from t_project tp where tp.is_delete = 0 group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
	)

重点:主表级联主表基于筛选条件构建的临时表。添加Where 条件为筛选主表重复记录的条件,并设置is_delete = 1.

温馨提示:

主表数据清理的条件为:主表重复记录条件

业务表级联主表数据清理条件为:查询满足条件记录的字段条件

主表数据清理SQL:

update t_project ta
	inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
	on ta.tid = temp.tid and ta.ptid = temp.ptid and ta.project_no = temp.project_no
	set ta.is_delete = 1
	where ta.id not in (
		select min_id from (select min(tp.id) as min_id from t_project tp where tp.is_delete = 0 group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
	)

从表级联主表数据清理SQL: 

update t_arch ta
inner join (select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1) temp
on ta.tid = temp.tid and ta.ptid = temp.ptid and ta.project_no = temp.project_no
set ta.project_id = (select min(tp.id) from t_project tp where tp.tid = temp.tid and tp.temp.ptid and tp.project_no = temp.project_no group by  tp.tid, tp.ptid, tp.project_no limit 1)
where ta.project_id in (
	select tp.id from t_project tp where tp.tid = temp.tid and tp.ptid = temp.ptid and tp.project_no = temp.project_no
)

 数据清洗必杀技-存储过程

 如果数据清洗SQL 无法到达数据清洗的预期,那接下来我将使用存储过程实现数据清洗功能。

前提条件:

  • 熟悉和了解MySQL 8 存储过程基本语法。
  • 熟悉存储过程中的变量声明和赋值。
  • 熟悉存储过程中的游标声明和遍历。
  • 熟悉存储过程中的IF...ELSE 判断
  • 熟悉存储过程中的运算符。

如果对于MySQL 8 存储过程的小白,建议参考学习:MySQL 8 一文读懂存储过程

项目和案卷清洗存储过程源码: 

delimiter $
create procedure distanct_project()
begin
	-- 变量声明
	declare tid varchar(64);
	declare ptid varchar(64);
	declare project_no varchar(64);
	declare min_id varchar(64);
	-- 定义游标遍历标识符
	declare done int default 0;
	-- 游标定时
	declare project_cursor cursor for select tp.tid, tp.ptid, tp.project_no  from t_project tp group by  tp.tid, tp.ptid, tp.project_no having(count(1)) > 1;
	-- 游标全部遍历完成时,将游标遍历标识符设置为1
	declare continue handler for not found set done =1;
	
	-- 打开游标
	open project_cursor;
	
	-- 游标遍历
	read_project:LOOP
		-- 从游标中获取下一行数据
    	FETCH project_cursor INTO tid, ptid, project_no;
		-- 判断是否已经遍历完所有行
    	IF done THEN
      		LEAVE read_project;
    	END IF;
		
    	-- 查询
    	select min(tp.id) into min_id from t_project tp where tp.tid = tid and tp.ptid = ptid and tp.project_no = project_no group by  tp.tid, tp.ptid, tp.project_no limit 1;
		
    	-- 从表更新
    	update t_arch ta set ta.project_id = min_id where ta.tid =tid and ta.ptid =ptid and ta.project_no =project_no;
		
    	-- 主表更新
    	update t_project tp 
    		set tp.is_delete = 1
    			where tp.tid =tid and tp.ptid = ptid and tp.project_no = project_no and tp.id <> min_id;
    			
    	END LOOP;
 	-- 关闭游标
  	CLOSE project_cursor;
	
end $

call distanct_project ();

温馨提示: 对于复杂的业务数据清洗,例如:商品房管理系统:项目-》楼栋-》房屋-》网签合同-》预售证 等多层级多维度的数据清洗,无非就是游标中嵌套游标,再进行select 查询插入最后执行IF...ELSE 判断执行insert/update 语句。

今天的分析就到这里结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC 五 - Spring MVC的配置和DispatcherServlet初始化过程

今天的内容是SpringMVC的初始化过程&#xff0c;其实也就是DispatcherServilet的初始化过程。 Special Bean Types DispatcherServlet委托如下一些特殊的bean来处理请求、并渲染正确的返回。这些特殊的bean是Spring MVC框架管理的bean、按照Spring框架的约定处理相关请求&…

rtsp 拉流 gb28181 收流 经AI 算法 再生成 rtsp server (一)

1、 rtsp 工具 1 vlc 必备工具 2 wireshark 必备工具 3 自己制作的工具 player 使用tcp 拉流&#xff0c;不自己写的话&#xff0c;使用ffmpeg 去写一个播放器就行 4 live555 编译好live555&#xff0c; 将live555的参数修改以下&#xff0c;主要是缓存大小 文章使用c 来写一…

JavaScript Web APIs-01学习

复习&#xff1a; splice() 方法用于添加或删除数组中的元素。 **注意&#xff1a;**这种方法会改变原始数组。 删除数组&#xff1a; splice(起始位置&#xff0c; 删除的个数) 比如&#xff1a;1 let arr [red, green, blue] arr.splice(1,1) // 删除green元素 consol…

LinkedHashMap实现LRU缓存cache机制,Kotlin

LinkedHashMap实现LRU缓存cache机制&#xff0c;Kotlin LinkedHashMap的accessOrdertrue后&#xff0c;访问LinkedHashMap里面存储的元素&#xff0c;LinkedHashMap就会把该元素移动到最尾部。利用这一点&#xff0c;可以设置一个缓存的上限值&#xff0c;当存入的缓存数理超过…

取一个整数各偶数位上的数构成一个新的数字

1 题目 我可太难了&#xff0c;这题我的思路有点复杂&#xff0c;遇到的困难很多&#xff0c;总是值传递搞不清楚&#xff0c;地址传递总是写错。 从低位开始取出一个整数s的各奇数位上的数&#xff0c;剩下的偶数位的数依次构成一个新数t。 例如&#xff1a; 输入s&#xff…

vue自定义键盘

<template><div class"mark" click"isOver"></div><div class"mycar"><div class"mycar_list"><div class"mycar_list_con"><p class"mycar_list_p">车牌号</p>…

浪潮云海护航省联社金融上云,“一云多芯”赋能数字农业

农村金融是现代金融体系的重要组成部分&#xff0c;是农业农村发展的重要支撑力量&#xff0c;而统管全省农商行及农信社的省级农村信用社联合社&#xff08;以下简称&#xff1a;省联社&#xff09;在我国金融系统中占据着举足轻重的地位。省联社通常采用“大平台小法人”的发…

稳定性建设框架 | 京东物流技术团队

一、为什么要做稳定性建设 1、从熵增定律引出稳定性建设的必要性 物理学上&#xff0c;用“熵”来描述一个体系的混乱程度。卡尔弗里德曼提出熵增定律&#xff0c;他认为在一个封闭的系统内&#xff0c;如果没有外力的作用&#xff0c;一切物质都会从有序状态向无序状态发展。…

第一课:使用C++实现图片去水印

1.功能概述 实现图片去水印的方法有很多,下面提供一种基于OpenCV库的C++实现方法。主要思路是利用图像中不同水印区域之间的差异,进行区域提取、重构和合成,从而实现去除水印的效果。 2.具体实现 2.1.导入OpenCV库和头文件 #include <iostream> #include <o…

Vue2向Vue3过度Vuex核心概念getters

目录 1 核心概念 - getters1.定义getters2.使用getters2.1原始方式-$store2.2辅助函数 - mapGetters 2 使用小结 1 核心概念 - getters 除了state之外&#xff0c;有时我们还需要从state中筛选出符合条件的一些数据&#xff0c;这些数据是依赖state的&#xff0c;此时会用到get…

【Golang 接口自动化05】使用yml管理自动化用例

目录 YAML 基本语法 对象&#xff1a;键值对的集合(key:value) 数组&#xff1a;一组按顺序排列的值 字面量&#xff1a;单个的、不可再分的值&#xff08;数字、字符串、布尔值&#xff09; yml 格式的测试用例 定义yml文件 创建结构体 读取yml文件中的用例数据 调试…

unity pivot and center

一般采用pivot即默认的模式 选中物体的轴心 Center中心 选中多个物体&#xff0c;两咱情况下旋转的效果也不一样 围绕各自中心旋转 Center 围绕中心旋转

使用kafka还在依赖Zookeeper,kraft模式了解下

Kafka的Kraft模式 概述 ​ Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器…

【Qt专栏】实现单例程序,禁止程序多开的几种方式

目录 一&#xff0c;简要介绍 二&#xff0c;实现示例&#xff08;Windows&#xff09; 1.使用系统级别的互斥机制 2.通过共享内存&#xff08;进程间通信-IPC&#xff09; 3.使用命名互斥锁&#xff08;不推荐&#xff09; 4.使用文件锁 5.通过网络端口检测 一&#xf…

通过 Jetbrains GateWay实现Remote Development

本次环境准备 环境准备&#xff1a;win10、一台安装有树莓派系统的树莓派&#xff08;也可以是其他的服务器&#xff09; 第一步&#xff1a;通过官网下载JetBrains Gateway 官网地址&#xff1a;https://www.jetbrains.com/remote-development/gateway/ 第二步&#xff1a;安装…

【Hadoop】HDFS读写流程和客户端命令使用

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

论文阅读_变分自编码器_VAE

英文名称: Auto-Encoding Variational Bayes 中文名称: 自编码变分贝叶斯 论文地址: http://arxiv.org/abs/1312.6114 时间: 2013 作者: Diederik P. Kingma, 阿姆斯特丹大学 引用量: 24840 1 读后感 VAE 变分自编码&#xff08;Variational Autoencoder&#xff09;是一种生…

【精算研究01/10】 计量经济学的性质和范围

一、说明 计量经济学是使用统计方法来发展理论或测试经济学或金融学中的现有假设。计量经济学依赖于回归模型和零假设检验等技术。计量经济学也可以用来预测未来的经济或金融趋势。 图片来源&#xff1a;https://marketbusinessnews.com 二、 计量经济之简介 计量经济学是对经济…

Unity关键概念

Unity是一款跨平台的游戏引擎和开发工具&#xff0c;用于创建2D和3D游戏、交互式内容和应用程序。它提供了一个强大的开发环境&#xff0c;使开发者能够轻松地设计、开发和部署高质量的游戏和应用程序。 以下是Unity的几个关键概念&#xff1a; 游戏对象&#xff08;Game Obj…

JS中方法、函数、属性是一个东西吗

在 JavaScript 中&#xff0c;方法、函数和属性是相关但不完全相同的概念。 方法&#xff08;Method&#xff09;&#xff1a;在对象中&#xff0c;方法是对象的属性&#xff0c;但它的值是一个函数。方法可以通过对象来调用&#xff0c;并且可以访问对象的属性和其他方法。 …