Files
LabelChange-server/.trae/documents/diagnose_24h_rate_formula_plan.md
2026-06-01 16:30:29 +08:00

6.6 KiB
Raw Permalink Blame History

24H换单率异常超高的根本原因诊断与修复计划v2

问题修改后24H换单率仍然异常高4745%、17924%、11193%、78075%

用户需求明确表述24小时换单率的分子和分母分别是什么


第1阶段明确当前的计算定义

任务1读取SQL中24H换单率的完整计算公式

位置LabelReplaceRepository.cs 中的最终SELECT语句

检查内容

  • 找到24H换单率的计算表达式
  • 确认分子是什么字段/表达式
  • 确认分母是什么字段/表达式
  • 看看是否有其他修饰如乘以100

目的:得到精确的公式:24H换单率 = ? / ? × 100%

任务2逐个检查涉及的CTE

需要检查的CTE

  1. DailyHighLabelRateAssessed高标签率考核通过数

    • 检查是否有重复统计
    • 检查UNION ALL是否导致了重复
  2. DailyHighLabelRateShould高标签率应该换单数

    • 检查修改后的逻辑是否正确
    • 检查CONCAT是否导致了其他问题
  3. DailyBeforeNoonPassed16点前考核通过

    • 检查是否有重复的包裹被计算
  4. DailyAfternoonPassed16点后考核通过

    • 检查是否有重复的包裹被计算

任务3用SQL直接查询各CTE的结果

执行诊断查询

-- 查询某一天的数据分解
SELECT '日期' AS 类型, 日期 AS , 0 AS 数量
UNION ALL
SELECT 'DailyBeforeNoonPassed', CAST(16点前考核通过包裹数 AS CHAR), 16点前考核通过包裹数
UNION ALL
SELECT 'DailyAfternoonPassed', CAST(16点后考核通过包裹数 AS CHAR), 16点后考核通过包裹数
UNION ALL
SELECT 'DailyHighLabelRateShould', CAST(高标签率应该换单数 AS CHAR), 高标签率应该换单数

目的:看到每个数值,找出倍数关系


第2阶段分析数值关系

任务4倍数分析

假设某一天的数据

  • 高标签率应该换单数 = 100
  • 16点前考核通过 = 200
  • 16点后考核通过 = 100
  • 高标签率考核通过数 = 200 + 100 = 300
  • 24H换单率 = 300 / 100 × 100% = 300%(已经异常)

如果24H换单率 = 4745%

  • 可能是4745 / 100 × 100% = 4745%
  • 那么分子 = 4745分母 = 100
  • 这表示高标签率考核通过数 = 4745或者计算中的乘法错误

检查点

  • 16点前考核通过包裹是否被多次计算
  • 16点后考核通过包裹是否被多次计算
  • 是否有UNION ALL导致的重复
  • 是否有JOIN导致的笛卡尔积

任务5追踪单个包裹

选择一个具体的包裹

  • 查询这个包裹在 DailyBeforeNoonPassed 中是否出现1次
  • 查询这个包裹在 DailyAfternoonPassed 中是否出现1次
  • 查询在 DailyHighLabelRateAssessed 中被计算了几次
  • 确定重复的位置

第3阶段确定真正的问题

可能的原因

原因ADailyBeforeNoonPassed/DailyAfternoonPassed中有重复

症状

  • 同一个包裹在 DailyBeforeNoonPassed 中被计算多次
  • 或者同一个包裹在 DailyAfternoonPassed 中被计算多次

检查方式

SELECT 日期, COUNT(*) as 行数
FROM DailyBeforeNoonPassed
GROUP BY 日期
-- 应该每天只有1条记录如果有多条就是问题

原因BDailyHighLabelRateAssessed中UNION ALL导致重复

症状

  • DailyBeforeNoonPassed 和 DailyAfternoonPassed 的数据在 UNION ALL 后没有正确汇总
  • 或者 GROUP BY 日期后仍然有多行

检查方式

SELECT 日期, COUNT(*) as 行数
FROM DailyHighLabelRateAssessed  
GROUP BY 日期
-- 应该每天只有1条记录

原因C主SELECT中的JOIN导致笛卡尔积

症状

  • 多个 LEFT JOIN 导致了行数增加
  • 例如JOIN DailyHighLabelRateShould 和 JOIN DailyHighLabelRateAssessed 在同时时产生了交叉

检查方式

  • 在主SELECT中加入 COUNT(*),看总记录数
  • 检查是否多于预期

原因DCOUNT的方式问题

症状

  • 在外层SELECT中没有正确处理聚合
  • 或者在JOIN后没有正确聚合

第4阶段修复问题

修复策略(取决于根本原因)

如果是原因ADailyBeforeNoonPassed/DailyAfternoonPassed重复

修复方式

  • 检查这两个CTE的 GROUP BY 是否完整
  • 可能需要加入更多分组字段
  • 或者改成 SELECT DISTINCT

如果是原因BDailyHighLabelRateAssessed汇总错误

修复方式

-- 改为
DailyHighLabelRateAssessed AS (
    SELECT 
        日期,
        SUM(16点前考核通过包裹数) + SUM(16点后考核通过包裹数) AS 高标签率考核通过数
    FROM (
        SELECT DISTINCT 日期, 16点前考核通过包裹数, 0 AS 16点后考核通过包裹数 
        FROM DailyBeforeNoonPassed
        UNION ALL
        SELECT DISTINCT 日期, 0 AS 16点前考核通过包裹数, 16点后考核通过包裹数 
        FROM DailyAfternoonPassed
    ) t
    GROUP BY 日期
)

如果是原因CJOIN笛卡尔积

修复方式

  • 在主SELECT中加 GROUP BY 日期
  • 或者改变JOIN的方式让每个日期只有一条记录进入

如果是原因DCOUNT方式问题

修复方式

  • 确保所有字段都被正确聚合
  • 如果有非聚合函数的字段,必须在 GROUP BY 中

第5阶段编写清晰的24H换单率定义

任务:编写规范定义

定义模板

24H换单率 的定义
================

分子 = ___________准确的字段名或计算表达式
     = 来源CTE: ___________
     = 含义: ___________

分母 = ___________准确的字段名或计算表达式
     = 来源CTE: ___________
     = 含义: ___________

计算公式 = 分子 / 分母 × 100%

业务含义:

填写规则

  • 分子必须精确到SQL字段或表达式
  • 分母必须精确到SQL字段或表达式
  • 必须注明数据来源
  • 必须解释为什么这样定义

第6阶段验证修复

任务:验证修复后的结果

验证标准

  • 24H换单率 <= 100%
  • 分子 <= 分母
  • 每个日期的数据合理(对比业务预期)
  • 能够手工验证某一天的计算结果

测试用例

准备简单数据

  • 某一天100个应该换单的包裹
  • 其中80个在考核期限内完成
  • 预期24H换单率 = 80 / 100 × 100% = 80%

最终输出

清晰的表述

必须能够清楚地说出:

"24H换单率 = ________ / ________ × 100%"

例如:

  • "24H换单率 = 高标签率考核通过数 / 高标签率应该换单数 × 100%"
  • "其中高标签率考核通过数来自DailyHighLabelRateAssessed......"
  • "其中高标签率应该换单数来自DailyHighLabelRateShould......"