在数据库中查找最接近的数值

Tes*_*101 39 sql

我需要找到一个select语句,它将返回一个与我的输入完全匹配的记录,或者如果找不到完全匹配则返回最接近的匹配.

到目前为止,这是我的选择声明.

SELECT * FROM [myTable] 
WHERE Name = 'Test' AND Size = 2 AND PType = 'p' 
ORDER BY Area DESC
Run Code Online (Sandbox Code Playgroud)

我需要做的是找到与'Area'字段最接近的匹配,所以如果我的输入是1.125并且数据库包含2,1.5,1和.5,则查询将返回包含1的记录.

我的SQL技能非常有限,所以任何帮助都会受到赞赏.

Mik*_*keW 66

获取区域和输入之间的差异,取绝对值,使其始终为正,然后按顺序递增并取第一个

SELECT TOP 1 * FROM [myTable] 
WHERE Name = 'Test' and Size = 2 and PType = 'p'
ORDER BY ABS( Area - @input ) 
Run Code Online (Sandbox Code Playgroud)

  • 您将如何使用一组值而不是单个输入来实现此目的? (2认同)

Rya*_*ham 10

一些可怕的东西,沿着:

ORDER BY ABS( Area - 1.125 ) ASC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

也许?


Geo*_*don 5

Name如果您有许多行满足、Size和列上的等式谓词PType,那么您可能需要Area在查询中的列上包含范围谓词。如果该Area列被索引,则可以允许高效的基于索引的访问。

以下查询(使用 Oracle 语法编写)使用 a 的一个分支UNION ALL来查找具有最小目标的记录,而另一个分支查找具有最大目标的Area >=记录。Area <这两条记录之一将是您要查找的记录。然后您可以ORDER BY ABS(Area - ?input)从这两个候选人中选出获胜者。不幸的是,由于需要嵌套 SELECT 来强制执行所需的 ROWNUM / ORDER BY 优先级,因此查询很复杂。

SELECT *
FROM
  (SELECT * FROM
    (SELECT * FROM
       (SELECT * FROM [myTable]
         WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area >= ?target
         ORDER BY Area)
       WHERE ROWNUM < 2
     UNION ALL
     SELECT * FROM 
       (SELECT * FROM [myTable]
         WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area < ?target
         ORDER BY Area DESC)
       WHERE ROWNUM < 2)
     ORDER BY ABS(Area - ?target))
WHERE rownum < 2
Run Code Online (Sandbox Code Playgroud)

此查询的一个好的索引是(Name, Size, PType, Area),在这种情况下,预期的查询执行计划将基于两个索引范围扫描,每个扫描返回一行。