Oracle SQL实现金额匹配最小区间对应审批人查询需求
问题描述
现有两张Oracle表:
- Table A:仅包含
Amount字段,数据为200、500、100 - Table B:包含
Amount_From(区间下限)、Amount_To(区间上限)、Approver(审批人)字段,数据如下:Amount_From Amount_To Approver -100 499 Approver1 -499 1000 Approver2 -50 300 Approver3
需求:查询Table A中每个金额,匹配Table B中包含该金额的最小区间,返回对应的审批人。
解决方案
核心思路是先筛选出所有包含目标金额的区间,再通过计算区间长度(Amount_To - Amount_From)定位每个金额对应的最小区间,最终返回对应审批人。
以下是实现SQL:
SELECT a.Amount, b.Approver FROM TableA a JOIN ( SELECT a_inner.Amount, b_inner.Approver, ROW_NUMBER() OVER ( PARTITION BY a_inner.Amount ORDER BY (b_inner.Amount_To - b_inner.Amount_From) ASC ) AS rn FROM TableA a_inner JOIN TableB b_inner ON a_inner.Amount BETWEEN b_inner.Amount_From AND b_inner.Amount_To ) b ON a.Amount = b.Amount AND b.rn = 1;
代码说明
- 筛选符合条件的区间:子查询通过
BETWEEN关联两张表,过滤出所有包含Table A金额的区间记录。 - 按区间长度排序编号:用
ROW_NUMBER()窗口函数,以Table A的Amount分组,按区间长度升序排序,给每个分组内的记录分配序号(序号1对应最小区间)。 - 提取最终结果:外层查询仅保留序号为1的记录,即每个金额对应的最小区间审批人。
执行结果
运行后将得到如下输出:
| Amount | Approver |
|---|---|
| 100 | Approver3 |
| 200 | Approver3 |
| 500 | Approver2 |
注:若需求中200需匹配Approver1,说明存在额外的区间优先级规则(而非仅按长度),此时需调整排序逻辑(比如新增区间优先级字段后按该字段排序)。
内容的提问来源于stack exchange,提问作者Madhu
相关产品推荐
相关产品推荐

