先别急着删除重复数据。把当前页面、埋点代码和后台原始日志当作“证据包”冻结下来,按时间切出修复前、修复中、修复后三段记录,再决定哪些重复计入报表、哪些只留在审计文件里。这样做的直接结果是:你既能向业务方解释数字变化,又不会因为一次去重把真实转化一起抹掉。
重复触发通常有三类可区分的原因。第一类是页面或应用内事件被多次绑定,例如同一个按钮在脚本加载两次后各发一次请求。第二类是用户行为本身重复,例如刷新确认页、重复提交同一表单。第三类是回传链路重试,例如接收端超时后广告侧或服务端再次发送同一事件。
判断依据不是看总数翻倍,而是看同一事件标识在短时间窗口内是否携带几乎相同的参数。你可以先取一个转化标识,在原始日志里按时间排序,观察event_id、发生时间、设备标识和来源参数是否成组出现。若成组出现且间隔极短,更接近第一类或第三类;若间隔较长且伴随新的页面访问,更接近第二类。
这一步的实际动作是:在修复前先导出一份只读日志,不改动线上代码。它的结果是后续所有修复都能和这份基线对照,而不是靠记忆判断“以前大概是多少”。
建议把记录拆成修复前、修复窗口、修复后三段。修复前保留原始回传日志和当时使用的页面版本;修复窗口记录改动时间、改动人、改动内容以及是否做了灰度;修复后保留新日志和一段观察期的数据。三段都保留同一套字段,至少包括事件标识、发生时间、来源参数、页面版本和接收状态。
这样做的价值在于:当报表数字下降时,你能区分是重复被去掉,还是真实转化同时减少。若修复后总量下降,但去重后的唯一事件数与修复前去重结果接近,说明变化主要来自重复被消除;若唯一事件数也同步下降,则要优先排查修复是否误伤了正常触发。
假设某账户修复前一周记录到 1200 次转化事件,按事件标识去重后为 800 次;修复后一周记录到 820 次,去重后为 790 次。这个假设例子里,表面总量下降了约三成,但唯一事件只少了 10 次。此时更合理的下一步是核对那 10 次差异是否来自流量波动,而不是继续修改去重规则。
只留一个“转化数”字段没有修复价值。你需要保留能复现判断过程的字段:
如果某些字段在修复前没有采集,不要回头补造。应在记录中明确标注“该字段自某次改动后才有”,并把修复前的判断降级为基于现有字段的推断。这个动作会影响下一步:字段缺失时,优先补采集而不是直接改去重逻辑,否则你无法验证修复是否有效。
去重规则本身也要版本化。可以按事件标识加时间窗口去重,也可以按业务单据号去重,但两种口径不能混在同一份对比报表里。若业务允许同一用户多次转化,按事件标识去重更合适;若业务上同一单据只应计一次,按单据号去重更合适。
修复动作要记录影响范围:改了哪个页面、哪段回传逻辑、是否只对新事件生效、历史数据是否重算。若历史数据被重算,必须同时保留重算前的报表快照。否则一旦业务方追问“为什么上月数字变了”,你将无法还原。
一个可执行的动作是:在修复上线前,用同一批原始日志分别跑旧规则和新规则,把两份结果并排保存。结果是你能提前看到差异集中在哪些来源、哪些时段,从而决定是否需要分渠道说明,而不是等报表发布后再解释。
可以删除重复记录的条件是:重复原因已经定位、修复已经验证、且删除只影响分析副本而不影响原始日志。此时删除是为了让报表可读,不是为了让问题消失。
必须保留重复记录的条件是:重复原因尚未定位、涉及对外结算或对账、或者同一事件可能对应不同业务含义。例如用户重复提交但每次提交都产生独立服务请求时,简单去重可能掩盖真实的资源消耗。此时应保留原始记录,只在报表层增加“去重后口径”列。
无论选哪种,都不要把“请求量归零”或“抓取量下降”单独当作修复正确的证明。这些现象也可能来自流量减少、代码未触发或接收端过滤。要结合唯一事件数、来源分布和修复窗口一起判断。
把修复前后的记录分开保存、把去重规则版本化、把删除动作限制在分析副本内,你就能在数字变化时给出可核对的依据,而不是在报表和日志之间反复猜测。