簡體   English   中英

在數據庫中查找最接近的數值

[英]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

也許?

如果有許多行滿足NameSizePType列上的等式謂詞,那么您可能希望在查詢的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM