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