选择最接近的值小于给定值的条目

Posted

技术标签:

【中文标题】选择最接近的值小于给定值的条目【英文标题】:Selecting entries with nearest value less than given value 【发布时间】:2016-10-03 18:09:57 【问题描述】:

我想用 SQL (没有 PL/SQL!或类似的东西)。

我已经走到这一步了:

select max(RUN_ID) from RUN_TABLE where KEY = 'TEST#33' and RUN_ID < 3

这将返回与键匹配的最大值小于 3 的行,但我希望能够选择所有列。

Run_ID  Entity  Key
1         HK    TEST#11
2         AB    TEST#22
2         CK    TEST#33
3         TB    TEST#22
3         DB    TEST#33

我希望能够在拥有键 TEST#22 和最大 RUN_ID 4 来选择行时:

3   TB   TEST#22 

当说要检索的最大 RUN_ID 为 2 时

2   AB   TEST#22

【问题讨论】:

您使用的是哪个数据库引擎? (即mysql、sql server、postgres、oracle?) 【参考方案1】:
select Run_ID, Entity, Key from from RUN_TABLE a
where Run_ID = (select max(RUN_ID) from RUN_TABLE b where b.Key = a.Key and RUN_ID < 3)
and KEY = 'TEST#33'

【讨论】:

听起来很奇怪,但你知道如何在不写两次 'TEST#33' 的情况下完成吗?【参考方案2】:

类似:

select t1.*
from RUN_TABLE t1
join (
   select max(RUN_ID) AS MAX_RUN_ID
   from RUN_TABLE 
   where KEY = 'TEST#33' and RUN_ID < 3
) t2 ON t1.RUN_ID = t2.MAX_RUN_ID
WHERE KEY = 'TEST#33'

【讨论】:

听起来很奇怪,但你知道如何在不写两次 'TEST#33' 的情况下完成吗?【参考方案3】:

按运行 id 降序排列,只取第一行,对于 Oracle:

select top 1 * from RUN_TABLE
where KEY = 'TEST#33' and RUN_ID < 3
order by RUN_ID desc
fetch first 1 rows

或 SQL Server(因为 SQLFiddle 的 Oracle 选项已关闭):

select top 1 * from RUN_TABLE
where KEY = 'TEST#33' and RUN_ID < 3
order by RUN_ID desc

live demo on SQLFiddle。

【讨论】:

谢谢。好点子。顺便说一下,对于 Oracle 11g,您可以使用 rownum = 1。 @Puddle "11g" 是 Oracle 版本,而不是 SqlServer 版本。您使用的是 Oracle 还是 SqlServer?您上面的评论说 SqlServer,但您的版本说 Oracle。 哦,是的,我正在使用 Oracle

以上是关于选择最接近的值小于给定值的条目的主要内容,如果未能解决你的问题,请参考以下文章

数百万个 3D 点:如何找到最接近给定点的 10 个?

Oracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性

如何删除列表中高于某个给定值的所有条目?

选择多个条目的组合

从ViewModel设置条目的焦点

从 ViewModel 设置条目的焦点