/**************************************************************************************************************************************
博主是一名初级数仓开发人员,所以懂的知识非常有限,写博客的想法就是工作中会遇到很多新的挑战,经常会有一些新的知识冲击我的大脑,但是好记性不如敲代码,所以决定将工作中学到的一些知识分享出来,同时也是对自己的不断鞭策,博客中难免会有一些错误,有不足之处还请各位大佬指出!!!
ps:分享的东西没有什么逻辑可能,都是工作中接到的需求。
***************************************************************************************************************/
今天产品那边提出一个数据bug,大概就是底层表是有数据的,但是前端的报表没有展示出来。问题首先定位在报表配置逻辑那边(下面这一段代码是java开发报表时的一段sql逻辑) 通过定位数据在dm.dm_act_check_mom这张表里面是有的,但是注意下面有一个删选条件FROST IS NULL,FROST是一个删除标识。
SELECT("t.*, i.*");
FROM("dm.dm_act_check_mom t");
LEFT_OUTER_JOIN("(SELECT DISTINCT ZWL01, ZWL01T,"
+ " ZWL02, ZWL02T, ZWL03, ZWL03T, FROST"
+ " FROM XPP_XUANWU.ZWLQY) I ON DISTRICTID = I.ZWL03");
WHERE("FROST IS NULL");
其实这边只需要关注几个点,使用dm.dm_act_check_mom表中的DISTRICTID(区县id)字段关联ZWLQY行政区域的维表,而FROST就是标识该行政区域是否被逻辑删除。
问题基本就定位:dm.dm_act_check_mom里面记录了门店的id,该门店所属的区县id,以及其它的字段,如果有一天门店的信息发生改变,那么门店对应的区域id也会发生改变,但是历史数据中记载的还是当时门店所处的一个区域id,但是新的门店数据,显然区域id已经发送改变了,所以导致旧的区域id被逻辑删除以后,使用区域id去关联就会造成数据不对。
解决的方式就是根据最新的门店信息去更新dm.dm_act_check_mom表中的DISTRICTID(区县id)字段,这样的话就解决了这个数据bug。
解决方法步骤如下:
首先需要根据最新的门店信息和dm.dm_act_check_mom关联,取出DISTRICTID不一样的字段:(创建一张临时表保存不一样的数据)
create table temp001 as
select
distinct t1.storecode, --门店id
t1.districtid as districtid_old, --旧区域id
t2.districtid as districtid_new --新区域id
from dm.dm_act_check_mom t1
left join DM.DM_TB_STORE_INFO t2 on t1.STORECODE=t2.STORECODE where t1.districtid<>t2.districtid
更新表格的数据
update DM.DM_TB_STORE_INFO t1
set t1.districtid =
(select distinct t.districtid_new
from temp001 t
where t.storecode = t1.storecode)
where exists (select 1 from temp001 t2 where t2.storecode = t1.storecode);
记住更新完数据以后提交事务,当然在更新前可以看看需要更新的数据量如果很大,任务很急,可以优先考虑最近一段的数据,这样的话可以快速响应业务需求,之后自己在慢慢的补充更新(当然这样的前提是有时间或者其他什么字段可以标识更新范围)
这种问题在实际开发中是非常常见的一种bug,因为主数据会可能会经常发生一些调整,比如公司的组织架构经常发生调整,那么很可能就会造成类似的问题,所以记录在这里,以后绝对用得着!!!