今天碰到一个问题:患者档案里明明有联系电话,但是最终报表展示的时候,这个字段就是空的。跟着师哥一步步排查下来,思路清晰了很多,也把完整的排查逻辑整理了一下,以后遇到类似问题可以直接参考
一、问题场景
业务报表需要展示患者联系方式,但是实际生成的结果里,电话指标一直缺失。已知档案表中是有电话信息的,所以问题大概率出在数仓分层或者数据关联的某一环上。排查的核心思路就是:不盲目改脚本,先锁定单个人的数据,沿着数据链路一层层往上找断点。
二、整体排查思路
先在当前报表的SQL逻辑里排查,不着急跳出业务链路;如果确认关联、字段都没问题,再往更底层的数仓表追溯,找到数据从哪一层开始丢失,这样定位效率最高,也不会乱改乱动。
三、完整排查步骤
1. 锁定测试数据,精准定位单条记录
排查的时候千万不要全量跑数据,很容易看花眼。直接选一个档案里确定有电话的患者,用姓名+ID精准过滤,只盯着这一条数据查,所有判断都围绕它展开,这是最稳的方式。
2. 在报表SQL内部排查关联逻辑
先找到电话字段在SQL里的来源表,一般不会在检验报告主表里,而是通过 JOIN 关联过来的患者信息表。
先把完整SQL跑一遍,看电话字段是不是为 NULL。
如果有值,说明只是脚本没把字段加进去,或者前端没配置展示;
如果是 NULL,就继续往上查每一层关联是否正常,关联字段是否匹配,有没有因为关联方式导致数据被过滤掉。
3. 逐层向上核对每一张关联表
顺着SQL里的关联关系,从报表用到的表,依次查患者信息表、患者电话表,看哪一层开始没有电话数据。
只要前面的表都有,到某一层突然为空,问题就出在这一层的关联或者数据本身。
4. 跳出报表逻辑,向上游底层表排查
如果前面的关联都没问题,就要继续往数仓更底层查,也就是用来生成指标的BIT/DWD层基础表。
这些底层表是指标的真正数据源,上层所有报表都是从这里取数。只要这一层没有电话,后面再怎么关联都不可能取到。
四、最终问题根因
排查到最后发现,问题并不在报表SQL的关联逻辑上,而是用来生成电话指标的BIT层底层电话表,本身就没有这条患者的联系方式。
源头表没有数据,上层指标自然为空,属于底层数据采集或同步的问题,不是报表脚本的问题。
五、排查总结
以后再遇到指标缺失类问题,基本都可以按这个思路来:
先查报表脚本本身有没有漏字段、关联错误;
再查每一层中间表是否正常;
最后定位到数仓最底层的源头表。
大部分情况要么是关联断了,要么是底层压根没数据,顺着链路往上查,很快就能定位。
六、实习小感悟
刚接触数仓排查很容易慌,其实逻辑很固定,就是沿着数据血缘一层层追溯。不用上来就改脚本,先定位断点在哪一层,再判断是开发问题还是源头数据问题。多练几次,对分层和链路的理解会快很多