在Oracle中处理费率表的离群值
我正在处理与费率表不匹配的数值。使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。