履历记录数据重复巡检
业务场景:由于期初导入数据的时候,存在多次导入或者重复导入,在导入时候未设置联合唯一等等原因,导致履历记录数据出现重复。需要把重复的数据进行清理。
思路:以某几个可以通过组合判断出唯一性的字段进行组合,查询出需要的数据记录主键,删除不需要的记录。
解决方案:这里以重复导入了人员履历记录为例,进行巡检
--查询某个人的履历记录s
select
pk_psndoc,
pk_psnjob,
pk_psndoc_sub,
recordnum,
begindate,
enddate,
lastflag,
workcorp,
creationtime,
creator
from hi_psndoc_work
where pk_psndoc=(select pk_psndoc from bd_psndoc where name='张三')
order by begindate
--查询某个人的履历记录e
--履历记录巡检S
1、找到正确的履历记录主键
select PK_PSNDOC_SUB
FROM (select
T.*,
ROW_NUMBER() OVER(PARTITION BY T.mark ORDER BY T.begindate DESC) FLAG
FROM (
--所有履历
select
--以人员主键+开始日期+结束日期+工作单位+部门+职务+岗位 组合判断唯一性,如果不唯一就是需要删除的。
concat(concat(concat(concat(concat(concat(pk_psndoc,begindate),enddate),workcorp),workdept),workjob),workpost) as mark,
pk_psndoc,
pk_psnjob,
pk_psndoc_sub,
recordnum,
begindate,
enddate,
lastflag,
workcorp,
creationtime,
creator
from hi_psndoc_work
--where pk_psndoc=(select pk_psndoc from bd_psndoc where name in('张三')) --测试的时候可以以其中某个人为案例
order by begindate,enddate
)T
) TMP
WHERE TMP.FLAG = 1 -- 取第二条时:flag = 2
2、找到重复的履历记录主键
select pk_psndoc_sub from hi_psndoc_work where pk_psndoc_sub not in (
--1、找到正确的履历记录主键
select PK_PSNDOC_SUB
FROM (select
T.*,
ROW_NUMBER() OVER(PARTITION BY T.mark ORDER BY T.begindate DESC) FLAG
FROM (
--所有履历
select
--以人员主键+开始日期+结束日期+工作单位+部门+职务+岗位 组合判断唯一性,如果不唯一就是需要删除的。
concat(concat(concat(concat(concat(concat(pk_psndoc,begindate),enddate),workcorp),workdept),workjob),workpost) as mark,
pk_psndoc,
pk_psnjob,
pk_psndoc_sub,
recordnum,
begindate,
enddate,
lastflag,
workcorp,
creationtime,
creator
from hi_psndoc_work
order by begindate,enddate
)T
) TMP
WHERE TMP.FLAG = 1 -- 取第二条时:flag = 2
)
3、备份履历表hi_psndoc_work
create table hi_psndoc_work20210807 as select * from hi_psndoc_work;
4、删除重复的数据
delete from hi_psndoc_work where pk_psndoc_sub in(
--2、找到重复的履历记录主键
select pk_psndoc_sub from hi_psndoc_work where pk_psndoc_sub not in (
--1、找到正确的履历记录主键
select PK_PSNDOC_SUB
FROM (select
T.*,
ROW_NUMBER() OVER(PARTITION BY T.mark ORDER BY T.begindate DESC) FLAG
FROM (
--所有履历
select
--以人员主键+开始日期+结束日期+工作单位+部门+职务+岗位 组合判断唯一性,如果不唯一就是需要删除的。
concat(concat(concat(concat(concat(concat(pk_psndoc,begindate),enddate),workcorp),workdept),workjob),workpost) as mark,
pk_psndoc,
pk_psnjob,
pk_psndoc_sub,
recordnum,
begindate,
enddate,
lastflag,
workcorp,
creationtime,
creator
from hi_psndoc_work
order by begindate,enddate
)T
) TMP
WHERE TMP.FLAG = 1 -- 取第二条时:flag = 2
)
)
5、更新结束时间为空的lastflag为Y,不为空的为N
update hi_psndoc_work set lastflag='Y' where enddate is null ;
update hi_psndoc_work set lastflag='N' where enddate is not null
6、由于前面有删除数据,导致顺序号有间隔,这里先重新编顺序号
select
pk_psndoc,
pk_psndoc_sub,
begindate,
recordnum,
ROW_NUMBER () OVER ( PARTITION BY hi_psndoc_work.pk_psndoc ORDER BY hi_psndoc_work.begindate desc )-1 AS newrecordnum
FROM
hi_psndoc_work
7、将第六步的查询结果建成一个临时视图 HI_PSNDOC_WORKNUM
8、循环更新工作记录的recordnum 为视图中的newrecordnum
update hi_psndoc_work
SET hi_psndoc_work.recordnum = (select HI_PSNDOC_WORKNUM.newrecordnum from HI_PSNDOC_WORKNUM where HI_PSNDOC_WORKNUM.pk_psndoc_sub = hi_psndoc_work.pk_psndoc_sub)
WHERE EXISTS(select 1 FROM HI_PSNDOC_WORKNUM WHERE HI_PSNDOC_WORKNUM.pk_psndoc_sub = hi_psndoc_work.pk_psndoc_sub)
9、删除临时视图HI_PSNDOC_WORKNUM
--履历记录巡检S