声明: 只是记录工作中遇到的问题及解决思路,只能满足当前我个人的业务需求
问题1
工作中遇到一个需求:有两份来自不通系统且字段相同的数据,现在需要对它们对比(字段值逐一比较),然后以其中一份(事先选定)数据为标准,给对比的结果打标签。
如果把两份数据分别标记为A和B,且以A数据为标准,那么:
1.存在于A但是不存在于B的数据为【新增】数据;
2.存在于B但是不存在于A的数据为【删除】数据;
3.都存在于A和B,且字段值完全相等的数据为【为变化】数据;
4.剩余的就是【修改】数据。
这个思路还是蛮清晰的,但是这两份数据存在一个问题:需要关联的字段并不是唯一主键。具体来说,有两个字段,分别是:中心编码和部门编码。一个中心可能挂多个部门,我们对比主要是要看中心。本来想的思路是,一个部门只对应一个中心,那先拿中心编码关联,再拿部门编码去关联不就好了吗?
但是,看这一种情况:
数据A
中心编码 | 部门编码 |
---|---|
1 | A |
1 | B |
数据B
中心编码 | 部门编码 |
---|---|
1 | C |
1 | D |
如果按照部门去关联,发现数据A中根本没有C和D这两个部门,按照上述判断逻辑,A中的那两条数据会被标记为:新增
实际上这两条数据应该为:修改
解决思路
一种解决的方案是:
1.先按照上述判断逻辑打标;
2.去对比结果中,筛选出被标记为:新增的数据,再通过中心编码分组,统计记录条数;同样的方法,统计数据B的中心编码和对应记录条数。把这两个结果的记录条数做对比,如果相同,说明这些数据都应该被标记为【修改】;如果不同,假设记录数的差为n,那这n条数据就是【新增】,其余的是【修改】。(这里保证A数据条数 >= B数据条数)。
但是,又有一个问题,如果n > 0,我怎么知道到底哪n条是新增的,剩下的是修改的呢?
这里只能随便选了,看个例子
数据A
中心编码 | 部门编码 |
---|---|
1 | A |
1 | B |
数据B
中心编码 | 部门编码 |
---|---|
1 | C |
这里对比结果,A的两条数据都会被先标记为新增,然后,我们对比数据条数的差,发现A比B多一条,那么按照上述逻辑,A数据其中一条是修改,其中一条是新增。那我就随便选一条更新为修改,就可以了。
问题2
延续问题1,现在需要把标记为【修改】的数据的其中一个字段,比如说:手工码,标记为数据B的手工码。
但是,打的更新标签是随机选的,我怎么找到对应的手工码呢?
解决思路
还是随机选,但是要去重,比如:
数据A
中心编码 | 部门编码 | 手工码 |
---|---|---|
1 | A | null |
1 | B | null |
数据B
中心编码 | 部门编码 | 手工码 |
---|---|---|
1 | C | 123 |
1 | D | 321 |
B的手工码有:123、321, 分别随机赋值给A的手工码就可以了。这一步在业务层很好做,但是我就是想直接写sql,咋办呢。
可以分别给两份数据标上行号,那么直接更新对应行号的数据就可以了,比如:
数据A
中心编码 | 部门编码 | 手工码 | 行号 |
---|---|---|---|
1 | A | null | 1 |
1 | B | null | 2 |
数据B
中心编码 | 部门编码 | 手工码 | 行号 |
---|---|---|---|
1 | C | 123 | 1 |
1 | D | 321 | 2 |
只要通过行号关联,然后更新就可以了,巧妙!