结论先说:不要按页数去重,要按“对象标识”去重。只有当每页确实对应一个独立查询对象、且对象之间不存在包含或别名关系时,页数才等于对象数。否则应把报告导出为可筛选的明细,用对象名、对象类型、所属分组三者组合成唯一键,再决定哪些对象退出、哪些保留。
常见有三种原因,处理方式完全不同。第一种是分页重复:同一对象因为结果行数多被拆到多页,页数虚高但对象没重复。第二种是别名重复:同一对象以简称、全称、旧称分别出现,看起来是多个对象。第三种是层级重复:父级对象和它下面的子级对象同时出现在报告里,父级只是汇总行。
区分方法很直接:随机抽三到五页,看第一列或标题列是否出现完全相同的字符串。如果相同字符串跨页出现,属于分页重复;如果字符串不同但指向同一事物,属于别名重复;如果一行是另一行的上级,属于层级重复。这个抽查动作只需几分钟,却能决定后面用哪种去重键。
不同对象类型的唯一标识不一样,用错键会把该保留的删掉。
如果报告里没有稳定标识,只有展示名称,那么去重结果只能作为候选清单,必须回到源系统核对后再执行退出操作。这一步不能省,因为展示名称是最容易重复也最容易改动的字段。
假设某份报告共 240 页,每页 50 行,合计 12000 行。按页数直觉会认为有 12000 个对象。但抽查发现,前 60 页全部属于同一个父级对象下的子项,父级汇总行在每页页脚重复出现。按“路径 + 对象类型”去重后,实际对象数是 3200 个,其中约 400 个是父级汇总行,不应作为独立对象处理。
这个数字只是用来说明比较方法:页数乘以每页行数得到的是行数,不是对象数;行数减去重复行和汇总行,才是候选对象数。真实比例取决于报告结构和对象命名规范,不能套用这里的假设数值。
反例是存在的:如果报告由系统按“一个对象一页”导出,每页有且只有一个对象,且对象之间没有父子层级和别名关系,那么页数就等于对象数,此时去重是多余的。判断依据是导出配置里是否勾选了“每对象独立分页”以及是否包含汇总行。如果无法确认导出配置,仍应按明细去重,而不是相信页数。
还有一种容易误判的情况:某次查询返回的页数突然减少甚至归零。这不能单独证明对象已被清理干净,也可能是查询条件变化、权限范围收窄或数据尚未同步。需要对照同一条件下的对象明细数量,才能判断是真实减少还是查询口径变化。
具体动作是:把报告导出为明细,新增一列“唯一键”,用公式拼接对象名、对象类型和所属分组;对唯一键做计数,计数大于 1 的行标记为待确认;人工确认待确认行属于分页重复、别名重复还是层级重复;确认后生成两份清单,一份是确定退出的对象,一份是保留但需要合并别名的对象。
这个动作的结果会直接影响下一步:如果待确认行里层级重复占比高,说明报告本身混入了汇总数据,应先调整导出配置再重新导出,而不是在脏数据上继续去重;如果别名重复占比高,说明命名规范需要先统一,否则退出操作可能误删仍在使用的对象。只有确定退出的清单经过源系统核对后,才可以进入实际退出流程。