当前位置: 首页 > news >正文

数据库小技巧-使用开窗函数矫正数据库指定列部分列值重复的数据

需求描述

目前有某表的某列部分值重复,需要批量矫正该列数据,确保该列分组内不会出现重复值。

解决思路

-- 创建个临时表
create table t_tmp_20250428(
c_bh varchar(32), -- 主键
c_bh_aj varchar(32), -- 主表外键,分组条件,不同分组内可以重复,同一组内c_mc不可以重复
c_mc varchar(300), -- 有重复值的列
n_xh int -- 分组内的序号,不一定有值
);-- 插入模拟数据,用于模拟问题场景
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj1', '封皮', 1);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj1', '立案通知书', 2);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj1', '判决书', 3);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj1', '再审申请书', 4);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj2', '封皮', 1);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj2', '立案通知书', 2);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj2', '判决书', 3);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj2', '再审申请书', 4);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj2', '再审申请书', 5);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj2', '再审申请书', 6);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj3', '封皮', 1);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj3', '立案通知书', 2);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj3', '判决书', 3);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj3', '判决书', 4);
insert into t_tmp_20250428 values (replace(public.uuid_generate_v4()::text, '-', ''), 'aj3', '判决书', 5)-- 更新前可以先查询一下要更新的结果是否符合预期(数据量大记得加条件,不然容易卡死)
select c_bh, c_bh_aj, c_mc, c_mc || n_xh_fenzu, n_xh from (select c_bh, c_bh_aj, c_mc, row_number() over(partition by c_bh_aj, c_mc order by n_xh) as n_xh_fenzu,n_xh from t_tmp_20250428) res
where n_xh_fenzu > 1;-- 上面查询脚本确认没问题时,先备份业务库,再执行更新脚本(若有其他子分组条件,可以继续在partition by 后面追加分组条件,如 partition by c_bh_aj, c_bh_ml, c_mc)
update t_tmp_20250428 set c_mc = tmp.c_mc || tmp.n_xh_fenzu from (select * from (select c_bh, c_bh_aj, c_mc, row_number() over(partition by c_bh_aj, c_mc order by n_xh) as n_xh_fenzu  from t_tmp_20250428) res
where n_xh_fenzu > 1) tmp where t_tmp_20250428.c_bh = tmp.c_bh;-- 更新完毕后再确认一下结果是否符合预期(数据量大记得加条件,不然容易卡死)
select * from t_tmp_20250428 order by c_bh_aj, n_xh;-- 用完记得删除临时表(如果仅仅是用于演示,建表时可以用 create temp t_tmp_20250428这种方法来创建临时表,会话结束后不需要手工删除临时表,数据库会自动清理)
drop table t_tmp_20250428;

相关文章:

  • 数字图像处理 -- 眼底图像血管分割方法
  • (八)RestAPI 毛子(Unit Testing)
  • 爬虫学习笔记(二)--web请求过程
  • 如何获取按关键字搜索京东商品详情(代码示例)
  • Modbus总线协议智能网关协议转换案例解析:提升系统兼容性
  • 导入使用 Blender 创建的 glTF/glb 格式的 3D 模型
  • 激光测距仪,精准测量的利器
  • C++ 可调用实体 (详解 一站式)
  • 在Linux系统中安装MySQL,二进制包版
  • STL标准模板库
  • 设备指纹护航电商和金融反欺诈体系建设
  • delphi使用sqlite3
  • 入门版 鸿蒙 组件导航 (Navigation)
  • Java 中的 Continuation:深入理解虚拟线程的基石
  • Uni-app网络请求AES加密解密实现
  • Uniapp:showLoading(等待加载)
  • Docker安装的mysql限制ip访问
  • 1. 用户之窗
  • iVX 图形化编程如何改写后端开发新范式
  • 后端Web实战之登录认证,JWT令牌,过滤器Filter,拦截器Interceptor一篇文章so easy!!!
  • 三位成功女性,如何应对失败
  • 特朗普声称中方领导人打了电话,外交部:近期中美元首没有通话
  • 央行副行长:研究建立民营中小企业增信制度,破解民营中小企业信用不足等融资制约
  • 中国贸促会:有近50%的外贸企业表示将减少对美业务
  • 张家界乒乓球公开赛设干部职级门槛引关注,回应:仅限嘉宾组
  • 中公教育:去年全面扭亏,经营性现金流增长169.6%