[英]Find closest numeric value in database
我需要找到一个select语句,它将返回一个与我的输入完全匹配的记录,或者如果找不到完全匹配则返回最接近的匹配。
到目前为止,这是我的选择声明。
SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p'
ORDER BY Area DESC
我需要做的是找到与'Area'字段最接近的匹配,所以如果我的输入是1.125并且数据库包含2,1.5,1和.5,则查询将返回包含1的记录。
我的SQL技能非常有限,所以任何帮助都会受到赞赏。
获取区域和输入之间的差异,取绝对值,使其始终为正,然后按顺序递增并取第一个
SELECT TOP 1 * FROM [myTable]
WHERE Name = 'Test' and Size = 2 and PType = 'p'
ORDER BY ABS( Area - @input )
一些可怕的东西,沿着:
ORDER BY ABS( Area - 1.125 ) ASC LIMIT 1
也许?
如果有许多行满足Name
, Size
和PType
列上的等式谓词,那么您可能希望在查询的Area
列中包含范围谓词。 如果Area
列被索引,则可以允许有效的基于索引的访问。
以下查询(使用Oracle语法编写)使用UNION ALL
一个分支查找具有最小Area >=
您的目标的记录,而另一个分支查找具有最大Area <
您的目标的记录。 这两条记录中的一条将是您正在寻找的记录。 然后你可以通过ORDER BY ABS(Area - ?input)
从这两个候选人中挑选出胜利者。 遗憾的是,由于嵌套的SELECTS需要强制执行所需的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
此查询的良好索引将是(Name, Size, PType, Area)
,在这种情况下,预期的查询执行计划将基于每个返回单行的两个索引范围扫描。
如何通过输入和[区域]之间的差异进行排序,例如:
DECLARE @InputValue DECIMAL(7, 3)
SET @InputValue = 1.125
SELECT TOP 1 * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p'
ORDER BY ABS(@InputValue - Area)
SELECT *
FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p'
ORDER BY ABS(Area - 1.125)
LIMIT 1
- MarkusQ
如果使用MySQL
SELECT * FROM [myTable] ... ORDER BY ABS(Area - SuppliedValue) LIMIT 1
请注意,虽然几乎所有东西都支持ABS(),但它在技术上并不标准(至少在SQL99中)。 如果由于某种原因必须编写ANSI标准SQL,则必须使用CASE运算符解决该问题:
SELECT * FROM myTable
WHERE Name='Test' AND Size=2 AND PType='p'
ORDER BY CASE Area>1.125 WHEN 1 THEN Area-1.125 ELSE 1.125-Area END
选择最小值[field]> your_target_value选择最大值[field] <your_target_value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.