阶梯分段计费的SQL建模本质是通过LEFT JOIN或INNER JOIN配合范围判断(如>= AND max_amount等异常。

什么是阶梯分段计费的SQL建模本质
阶梯计费不是“匹配某条记录”,而是“找到满足条件的最高/最低档位”。它天然对应 LEFT JOIN 或 INNER JOIN 配合范围判断(BETWEEN、>= AND ),而非等值连接。直接用 = 肯定查不出结果——因为计费档位表和订单表没有主键/外键相等关系。
用 JOIN ... ON value BETWEEN low AND high 实现正向匹配
这是最常用也最直观的方式,适用于档位区间左闭右闭(如 0–100、101–500)。注意必须确保区间不重叠、无缺口,否则可能匹配多行或漏行。
常见错误现象:JOIN 返回多条记录(区间重叠)、NULL 档位(数值超出所有区间)、性能差(缺少索引)。
- 档位表字段建议含:
tier_id、min_amount、max_amount、rate或fee ON o.amount >= t.min_amount AND o.amount 比BETWEEN更易控制边界(尤其当需要左闭右开时)- 在
min_amount和max_amount上建立联合索引可显著提升 JOIN 效率
ROW_NUMBER() OVER (...) WHERE rn = 1
- 排序字段通常为
min_amount DESC(找“能覆盖该值的最大下限”)或max_amount ASC(找“最小上限”) - 必须用
PARTITION BY order_id防止跨订单错序 - MySQL 8.0+、PostgreSQL、SQL Server 2017+ 支持;旧版 MySQL 需用变量模拟
GROUP BY + MAX/MIN










