在Oracle中处理费率表的离群值

编程语言 2026-07-10

我正在处理与费率表不匹配的数值。使用Oracle SQL。

以下是场景:成本从 Rates 表中获取:

产品类型 功率起点 功率终点 高度最小值 高度最大值 成本
产品A 0 200 0 1 10
产品A 0 200 2 3 20
产品A 0 200 4 5 30
产品A 0 200 6 7 40
产品A 201 400 0 1 50
产品A 201 400 2 3 60
产品A 201 400 4 5 70
产品A 201 400 6 7 80

要点(Gist of the SQL code):

SELECT m.*, NVL(r.cost, 0) 
FROM m
LEFT JOIN e on e.key = m.key
LEFT JOIN rates r ON m.height BETWEEN (r.height_min AND r.height_max)
                  AND (e.power BETWEEN r.power_start AND r.power_end)
                  AND m.power BETWEEN (r.power_start AND r.power_end)
                  AND r.product_type = m.product_type

现在当 m 的高度为null时,我想按0-1高度区间的成本执行(这是可用的最低阶梯),并取相应的功率;如果高度超过7,则获取6-7区间的成本(最高阶梯)及相应的功率。

如何用最简单的方式实现?

解决方案

假设rates是一个较小的表,并且你打算按产品类型进行筛选,那么把 m.height 替换为 least(7,nvl(m.height,0))。这段写法很紧凑,但也会削弱对高度的连接优化,因此仅适用于小到中等规模的费率表。

你也可以把所有这些封装在一个 greatest(0,...) 函数中,用于排除负高度,尽管你并未把这作为一个要求提及。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章