目标:之前用kettle对数据进行处理,因为要对数据进行迁移,所以希望将kettle的逻辑全部改成存储过程,对数据进行处理
运行过程中最常见的一个问题出在排序这里
1、ROW_NUMBER()
当满足条件的记录有多条,要对记录进ROW_NUMBER(),取number值作为一个ID,然后通过ID筛选出合适的记录。如果此时多条记录PARTITION BY的字段取值内容完全一致,并且order by的内容也一致(比如余额都是0的情况),那么这里的ID可能就是一个相对随机的数据,跟kettle里面处理出来的可能会存在不一致的情况,这就导致双方取数不一致,也就导致最终的结果是不一致的。
当分组和排序所依赖的字段完全一样的情况下,ROW_NUMBER()函数在给定顺序方面可能会出现不确定性。这是因为ROW_NUMBER()函数是基于查询结果集的逻辑顺序进行计算的,而不是基于特定的物理排序。
在这种情况下,如果您希望确保ROW_NUMBER()函数的顺序是确定的,可以考虑添加额外的排序条件,以确保结果的一致性。可以使用其他列或表达式作为排序条件,以使结果集的顺序明确。
可能的解决问题的办法:使用其他的完全能够使得排序一致的字段进行分组排序
2、依赖关系
要确认一下依赖关系,看看是不是有其他的存储过程等向老表里面插数据
3、填报类表
确认一下这个迁移的表是不是填报类的报表
如果是的话,要查看一下数据对不上的字段是不是可以被手动填报的字段
如果是的话,看看是不是会实际修改这个字段的数据
4、空值与空字符串
在核对新老数据的时候我们从新表老表中拿出对应的数据,从老表中拿出一条记录a,从新表中拿出对应的一条记录b,可以将这两条数据粘贴在Excel中使用if判断不同的字段在哪里,但是这种方式会有一种情况不能检查出来。
如果记录a某个字段是空值,数据b对应的字段是空字符串,这样在Excel里面是无法被检查出来的,最好是直接在数据库里面观察
5、中文字符的显示问题
在某些时候kettle与存储过程处理之后的名字是不太一样的,这种情况一般是因为原来的数据就是有问题的,主要是体现在中文字符的显示上
中文名字之间最好不要存在空格
6、查看是否存在保存历史的表
在做数据迁移的时候,尤其是不存储历史的数据而言(只有一天的数据),要看一下系统里面是不是有历史表存储每天的数据,这样出现不一样的数据的时候也便于验证前些天的数据