先给结论:当报告页数大于实际对象数量时,优先按“对象身份”去重,而不是按页码去重;只有当同一对象在不同页出现且身份字段缺失时,才退回到按行内容指纹合并。两种做法成立的条件不同,选错会把两个真实对象误合成一个,或者让同一对象继续占两行。
报告页数不等于对象数量,通常来自三种机制,处理方式完全不同。
判断顺序建议是:先看重复是否跨页成片出现,再看名称差异是否指向同一实体,最后看是否存在维度列。三种原因混在一起时,先处理分页重复,因为它最容易误判。
按对象身份去重的做法是:为每个对象确定一个稳定标识,例如规范化后的名称加限定范围,然后只保留该标识下的第一条或聚合后的结果。
它成立的条件是:报告里存在能唯一指向对象的字段,且该字段在不同页之间保持一致。满足这个条件时,去重结果最接近真实对象数量,后续统计和分配任务都不会重复。
代价是:如果标识字段本身被截断、被改写,或者两个真实对象恰好共用一个名称,就会发生误合并。误合并比重复更危险,因为重复只是多算,误合并会直接丢掉一个对象。
实际动作:先导出全部页,只保留对象标识列并排序,统计唯一值个数,再与报告页数对比。如果唯一值个数明显小于总行数,说明重复主要来自分页或别名;如果两者接近,说明页数多的原因更可能是维度展开,此时不应删除行,而应把维度列拆出去单独看。
当对象标识字段缺失或不可靠时,可以退回到按行内容指纹合并:把每行的关键字段拼成一个字符串,完全相同的行只保留一条。
这种做法成立的条件是:重复行确实逐字相同,且不同对象不会产生完全相同的行。它的好处是不依赖任何单一字段,坏处是对格式差异毫无容忍度——多一个空格、换一种分隔符,同一对象就会被当成两行。
一个反例足以让“按行指纹”失效:假设报告里两个不同对象因为名称被截断成相同字符串,其余字段也恰好一致,指纹法会把它们合并。此时正确做法不是继续调指纹规则,而是回到源数据补全对象标识,或者改用名称加范围两列联合判断。
假设某次查询导出后共有 60 行、6 页,每页 10 行。按对象标识去重后得到 42 个唯一对象;按整行指纹去重后得到 55 行。两个数字差距这么大,说明大量行并非逐字重复,而是同一对象在不同页以不同附加信息出现。
这时不要直接采用其中任何一个数字,而是抽样检查:从 42 与 55 的差集里随机取若干行,看它们是同一对象的维度展开,还是被指纹法漏掉的真实重复。如果差集里多数是同一对象的维度行,那么 42 更接近对象数;如果差集里多数是同一行的格式变体,那么 55 偏高,需要先统一格式再重新统计。
这个比较方法的关键不是记住数字,而是用差集定位分歧来源,再决定下一步是补标识字段还是补格式清洗。
无论采用哪种做法,都要把判断依据写下来,至少包括:用哪个字段作为对象标识、格式如何统一、维度列是否参与去重、差集如何抽样核对。这样下一次报告页数再次异常时,可以直接复用规则,而不是重新争论。
如果核对后仍无法确定唯一对象数,说明源数据的对象标识不足以支撑去重,此时应暂停基于该报告做数量结论,先回到查询环节补全限定条件,再重新导出。