Oracle:需要查询来获取特定范围的数据

时间:2016-04-18 05:29:07

标签: sql oracle plsql

数据表

+-------------------------------------------+
| id    start_range     end_range    descr  |
+-------------------------------------------+
| 1        500            550         data1 |
| 2        500            500         data2 |
| 3        510            510         data3 |
+-------------------------------------------+   

所以我需要帮助来创建一个输入范围值的查询,并检查开始和结束范围,如果它在范围内则应该相应地返回行。

对于前。

input: 500 output: data2
input: 510 output: data3
input: 502 output: data1
input: 550 output: data1
input: 551 output: null

1 个答案:

答案 0 :(得分:0)

你可以

  • 一个匹配的数字为500-550的510
  • 在500-500和500-550
  • 中有几场比赛为500
  • 与551
  • 不匹配

所以你必须从你的比赛中选择你认为“最好”的记录。一种方法是使用ROW_NUMBER对匹配进行排名:

select descr 
from
(
  select descr,
    row_number() over (order by end_range - start_range) as rn
  from mytable
  where @value between start_range and end_range
)
where rn = 1;

这为您提供了“最佳”描述的行,或者在没有匹配时没有行。

另一种选择是Oracle的KEEP DENSE_RANK

select max(descr) keep (dense_rank first order by end_range - start_range)
from mytable
where @value between start_range and end_range;

这为您提供了“最佳”描述,或者在没有匹配时为NULL。