# 24小时换单率 分子/分母 精确定义与诊断报告

**诊断完成日期**：2026-05-16  
**问题**：24H换单率超过100%（4745.83%、17924.00%、11193.10%、78075.00%）

---

## 第一部分：24H换单率的精确定义

### 分子（Numerator）：高标签率考核通过数

**来源**：`DailyHighLabelRateAssessed` CTE（第1037-1047行）

**完整计算链**：
```
DailyBeforeNoonPassed（第999-1015行）
    ↓
    按照"首次成功日期"分组
    统计：16点前到仓 + 完成时间<=考核时间 + 高标签率(ar.考核时间 IS NOT NULL)
    结果：16点前考核通过包裹数
    
DailyAfternoonPassed（第1017-1034行）
    ↓
    按照"首次成功日期"分组
    统计：16点后到仓 + 完成时间<=考核时间 + 高标签率(ar.考核时间 IS NOT NULL)
    结果：16点后考核通过包裹数
    
DailyHighLabelRateAssessed（第1037-1047行）
    ↓
    UNION ALL两个表后，GROUP BY 日期
    SUM(16点前) + SUM(16点后) = 高标签率考核通过数
```

**精确定义**：
```
分子 = 按"首次成功日期"分组的，
       在24小时考核期限内完成的，
       且冻结标签率≥80%的交接单中的包裹总数
```

**关键特征**：
- 按`首次成功日期`（完成时间）分组
- 包含两部分：16点前到仓完成 + 16点后到仓完成
- 都要求"完成时间 <= 考核时间"
- 都要求"高标签率"（考核时间 IS NOT NULL）

---

### 分母（Denominator）：高标签率应该换单数

**来源**：`DailyHighLabelRateShould` CTE（第1065-1082行）

**完整定义**：
```sql
SELECT 
    DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00')) AS 日期,
    COUNT(DISTINCT CONCAT(ar.BillOfLadingNumber, '|', ar.MasterPackageNumber)) AS 高标签率应该换单数
FROM ArrivalRequests ar
INNER JOIN (
    SELECT DISTINCT 
        BillOfLadingNumber,
        MasterPackageNumber
    FROM InterchangeUnitLabelRates
    WHERE label_rate_percent >= 80
) high_label_units ON ar.BillOfLadingNumber = high_label_units.BillOfLadingNumber
                   AND ar.MasterPackageNumber = high_label_units.MasterPackageNumber
GROUP BY DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00'))
```

**精确定义**：
```
分母 = 按"到货日期"分组的，
       冻结标签率≥80%的交接单中的全部包裹总数
```

**关键特征**：
- 按`到货日期`（到货时间）分组
- 只要求冻结标签率≥80%，不要求已完成
- 是该日期应该履约完成的全部包裹数

---

### 完整公式

```
24H换单率 = (高标签率考核通过数 / 高标签率应该换单数) × 100%
```

---

## 第二部分：关键发现 - 维度不一致问题

### 核心问题：分子和分母的日期维度不同

| 项目 | 日期维度 | 含义 | 来源CTE |
|------|--------|------|--------|
| **分子** | 首次成功日期 | 完成的日期 | DailyHighLabelRateAssessed |
| **分母** | 到货日期 | 应该完成的日期 | DailyHighLabelRateShould |

### 导致的后果

**数学上不可能**：分子和分母的日期不同步导致比率超过100%

**具体例子**：
```
2026-05-15：
- 应该换单数（分母）= 100个包裹（到货在05-15）
- 完成的包裹数（分子）= 0个（因为大多数在05-16完成）
- 24H换单率 = 0 / 100 = 0%

2026-05-16：
- 应该换单数（分母）= 50个包裹（到货在05-16）
- 完成的包裹数（分子）= 130个（包括05-15到货但05-16完成的100个 + 05-16到货已完成的30个）
- 24H换单率 = 130 / 50 = 260% ← 超过100%！
```

这正是你看到的4745%、17924%等异常值的根本原因！

---

## 第三部分：问题根源诊断

### 根本原因：业务逻辑定义与代码实现的矛盾

**业务期望**（根据用户的表述）：
```
24H换单率 = (实际完成并通过考核的包裹数) / (应该履约完成的包裹数) × 100%

这是一个"期望通过率"的概念：
- 对于到货在05-15的订单，期望在24H内（到05-16 16:00-23:59）完成
- 对于到货在05-16的订单，期望在24H内（到05-17 16:00-23:59）完成
```

**代码实现**（当前）：
```
分子：按"完成日期"分组
分母：按"到货日期"分组

导致在某一天的24H换单率 = (可能包括多天到货的完成包裹数) / (仅该天到货的包裹数)
这是数学上错误的！
```

### 为什么会出现这个错误？

**推论**：
1. DailyHighLabelRateAssessed是按"首次成功日期"来汇总
2. DailyHighLabelRateShould是按"到货日期"来汇总
3. 在第1222-1223行的LEFT JOIN中：
   ```sql
   LEFT JOIN DailyHighLabelRateAssessed dhras ON t.日期 = dhras.日期
   LEFT JOIN DailyHighLabelRateShould dhlrs ON t.日期 = dhlrs.日期
   ```
4. 虽然都用`t.日期`作为JOIN条件，但这个日期实际上是不同含义的
5. 最终导致分子和分母被错误地配对

---

## 第四部分：修复建议

### 选项1：修改分子为按到货日期分组（推荐）

**核心逻辑**：
- 分母：按到货日期统计应该换单数（已正确）
- 分子：改为按到货日期统计完成数，而不是按首次成功日期

**修改步骤**：
1. 修改 DailyBeforeNoonPassed：改`GROUP BY DATE(CONVERT_TZ(oss.首次成功时间, '+00:00', '-05:00'))`为`GROUP BY DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00'))`
2. 修改 DailyAfternoonPassed：同样修改
3. 修改 DailyHighLabelRateAssessed：改`GROUP BY 日期`的含义（来自哪个CTE）

**计算含义**：
```
某一天的24H换单率 = (该天到货的、在24H内完成的高标签率包裹) / (该天到货的、高标签率的全部包裹) × 100%
```

**优点**：符合业务逻辑，数学上正确，分子≤分母

---

### 选项2：保持按完成日期分组，修改分母

**修改步骤**：
1. 修改 DailyHighLabelRateShould：改`GROUP BY DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00'))`为按首次成功日期
2. 只统计已经完成的、高标签率的订单

**问题**：这样分母的含义会变，不符合"应该履约"的业务逻辑

---

## 第五部分：精确答案总结

### 用户问题："你给我表述下24小时换单率的分子和分母分别是什么"

**当前代码中的分子**：
```
分子 = 按首次成功日期分组的、在24小时考核期限内完成的高标签率包裹总数

含义：某一天完成的包裹中，有多少是高标签率且满足考核时间的
```

**当前代码中的分母**：
```
分母 = 按到货日期分组的、冻结标签率≥80%的全部包裹总数

含义：某一天到货的、标签率≥80%的全部包裹
```

**为什么超过100%**：
```
因为分子和分母的日期维度不同！

例如某一天：
- 分母 = 该天到货的50个高标签率包裹
- 分子 = 该天完成的100个高标签率包裹（来自前几天到货的）
- 比率 = 100/50 = 200% ← 超过100%
```

**正确的做法**：
```
分子和分母应该基于同一个日期维度：
  要么都按到货日期（推荐）
  要么都按完成日期
  
推荐按到货日期，因为这样符合"履约"的业务含义：
  某一天到货的订单，在24小时内完成的比例是多少
```

---

## 建议后续行动

1. **确认业务逻辑**：询问用户24H换单率到底应该统计什么？
   - A) 某天到货的订单，24小时内完成的比例？（推荐）
   - B) 某天完成的订单中，有多少满足考核要求？

2. **根据确认结果修改代码**：修改分子或分母之一，确保日期维度一致

3. **验证修复**：确保修复后24H换单率≤100%

---

## 关键代码位置

- DailyBeforeNoonPassed：第999-1015行
- DailyAfternoonPassed：第1017-1034行  
- DailyHighLabelRateAssessed：第1037-1047行
- DailyHighLabelRateShould：第1065-1082行
- 外层JOIN：第1212-1230行

