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提升查询性能之-简单范围分区表的创建

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

MySQL指定模糊查询范围 或 获取或者查询数据库字段的特定几位

需要一个 SQL 查询来从 SQL Server 数据库中获取特定条件下给定时间段的数据

需要一个 MySQL 查询来获取未在表中注册的日期