Oracle:需要查询来获取特定范围的数据
Posted
技术标签:
【中文标题】Oracle:需要查询来获取特定范围的数据【英文标题】:Oracle: need a query to fetch data for certain range 【发布时间】:2016-04-18 05:29:07 【问题描述】:数据表
+-------------------------------------------+
| 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
【问题讨论】:
只是一个友好的提示,您可能需要阅读此页面:The How-To-Ask Guide,这样您就可以始终确保您的问题易于回答且尽可能清晰。请务必包括您为解决遇到的问题所做的任何努力,以及尝试这些修复时发生的情况。也不要忘记您的显示代码和任何错误消息! 所以范围可以重叠。如果一个值匹配两个范围(因为 500 匹配 500-550 和 500-500),选择哪个范围?较小的范围(即 500-500,因为它只包含 1 个数字,而 500-550 包含 51)?但是如果有关系呢? 500 在 450-500 和 500-550 之间。或者你想要一个完全不同的算法来从几个中选择范围?定义规则。 如果我输入那么它应该选择 500-500 的范围,因为它与该范围完全匹配,如果我输入 501 那么它应该选择 500-550 范围......如果我再次输入 510 那么它应该选择 510-510 并忽略 500-550 范围..所以在范围内有可能获得一些与范围完全匹配并且只包含 1 个数字的输入..所以它应该选择最接近的集合。 @a_horse_with_no_name 如果我输入 510,您的查询将失败;然后它将返回 510-510 范围和 500-550 范围的数据 那么没有像 400-410 和 405-415 这样的重叠范围?唯一发生的重叠是存在实数范围,例如 500-550,以及单数“范围,例如 500-500。这是正确的吗? 【参考方案1】:你可以得到
在 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。
【讨论】:
以上是关于Oracle:需要查询来获取特定范围的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?
如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组
MySQL指定模糊查询范围 或 获取或者查询数据库字段的特定几位