上传源代码版本
This commit is contained in:
249
.trae/documents/24h_rate_numerator_denominator_diagnosis.md
Normal file
249
.trae/documents/24h_rate_numerator_denominator_diagnosis.md
Normal file
@@ -0,0 +1,249 @@
|
||||
# 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行
|
||||
|
||||
Reference in New Issue
Block a user