同一个统计看板,两个人拉出来的数对不上,这类事在业务系统里很常见。多数时候不是谁算错了,而是口径没归一------同一个词,两个人理解的不是一回事。这篇把三条容易分叉的口径摆出来,逐条讲怎么归一。
口径一:时间按创建还是按更新
头一条是时间。「本月新增」这个说法,按什么时间算,结果能差出一截。
按记录创建时间,还是按更新时间,是两条完全不同的线。一条上个月建的记录,这个月被改过一次,如果按更新时间截,它就会被算进本月,可它并不是本月新增的。
归一的做法是把口径写死在视图里。新增统一取创建时间字段 created_at,更新动作另算一个指标,两者不混。视图建好之后,看板只读这个视图,不直接查原始表。往后改的是视图定义,不是每次取数时临时商量。
还有一个容易忽略的点是时区。创建时间字段如果存的是本地时间,跨时区的账号取数就会错开几个小时,跨月那几天尤其明显。稳妥的做法是入库统一用协调世界时,看板按访客所在时区换算显示,换算只在展示层做一次,不要在下游各算各的。
口径二:同一个状态别叫两个名
第二条是状态。业务里同一步,不同入口可能落成两个不同的值。
比如一条记录在流程 A 里叫「跟进中」,在流程 B 里叫「处理中」,字段里存的字符串不一样,说的却是同一件事。看板按字符串分组,就会把它们拆成两行,数出来自然是分开的。
归一要在写入侧做,不在看板侧做。先写一个映射,把历史数据里的同义状态刷成同一个标准值,再在写入时加约束,只允许标准值入库。写入侧收口之后,看板侧不用做任何判断,分组结果天然是对的。
映射本身建议留一份对照说明,写清楚哪几个旧值归到哪个标准值。以后有人问某个数为什么和上个月不一样,翻这份说明就能对上,不用再去翻代码。
口径三:归属按主键还是按名字
第三条是归属。看板按「负责人」分组,这个负责人取的是账号还是名字。
取名字,改了名之后历史数据会跟着变,同一个人可能被分成两条;取账号主键,名字怎么改都不影响归组。两者看着差不多,数据量一大、人员一流动,差别就出来了。
归一就把分组键固定成账号主键,展示时再关联出名字。分组和展示分开之后,改组数据不会动到统计结果。
分组键挑的时候,用系统生成的不可变标识,别用手机号、邮箱这类会变的字段。凡是拿会变的字段做分组键,迟早会在某一次变更之后,把同一个人拆成两条记录。
三条口径之外,还有一个坑
三条口径归一之后,还有一个坑值得单独提:快照表和实时表混用。
有些指标走的是每日快照,比如每天的存量;有些走的是实时表,比如当前状态。两张表的刷新节奏不一样,如果放进同一个看板又不标注来源,就会出现「总数对不上明细」的情况。这不是口径问题,是数据源问题。
处理办法是在看板上把每个指标的来源标出来,快照和实时分开呈现,别让人以为它们出自同一处。必要时再补一个对账视图,把两张口子的口径摆在同一行里做差。
对账视图不必常驻在看板上,挂到数据侧的日常任务里定时跑就行,有差异再人工看。这样看板保持干净,对账又不缺手段。
口径先归一,数字才对得上
三条口径加上那个坑,说到底是同一件事:先定义清楚,再取数。时间按哪个字段、状态用哪个值、归属依哪个键,三样都写死,看板就不会出现两个人对不上的情况。这一步做完,再谈图表怎么画、指标怎么分层,才有意义。
这类归一属于数据侧的基本功,不依赖任何主观判断。上面每一项都能落到具体字段和具体视图上,做完拿两个账号分别取一次数,对不对得上一试便知。
把口径集中写在一份说明里,是**鲲极(鲲鹏的鲲)**这边做这类交付时的习惯------先定义,再动手搭看板。
以上是三条取数口径归一时留下的记录,供同行比对。