最大最近值sql

时间:2013-10-21 13:19:45

标签: sql vba

我有一张表有一些数值(直径) 18 21 27 34 42 48 60 76 89 114 等...

如果我在text.box中添加一个数字,如何选择最接近的最大值。 25选择27,100选择114,48选择48。

我输入以下代码,但它的行为不正确......它选择的是最接近的值,但不是MAX最接近的值:

strSQL = "SELECT * " & "FROM [materials] WHERE ABS([dia] - " & Me.TextBox1.Text & ") = (SELECT MIN(ABS([dia] - " & Me.TextBox1.Text & ")) FROM [materials])"

此代码位于连接到DAO数据库的Excel中的用户表单中。

谢谢!

3 个答案:

答案 0 :(得分:2)

strSQL = "SELECT TOP 1 * FROM materials " & _
         "WHERE dia >= " & Me.TextBox1.Text & " " & _
         "ORDER BY dia"

答案 1 :(得分:2)

假设您使用的是SQL Server,可以尝试使用

strSQL = "SELECT TOP 1 * " & "FROM [materials] WHERE [dia] >= " & Me.TextBox1.Text & " ORDER BY dia ASC"

如果是MySQL你必须使用LIMIT

  

LIMIT子句可用于约束返回的行数   通过SELECT语句。

答案 2 :(得分:1)

实际上,您的问题描述是错误的。
您不希望最接近的最近值,您希望最大值大于或等于请求的最小值。

您实际要求的解决方案是:

DECLARE @fVal float
SET @fVal = 116 -- 114.5 -- 114.4 -- 114.6 

;WITH CTE AS
(
    SELECT 
          dia 
        ,(@fVal - dia) AS dist 
        ,ABS(@fVal - dia) AS absdist 
        ,SIGN(@fVal - dia) AS sig 
    FROM 
    ( 
        SELECT 18.0 AS dia 
        UNION SELECT 21.0 AS dia 
        UNION SELECT 27.0 AS dia 
        UNION SELECT 34.0 AS dia 
        UNION SELECT 42.0 AS dia 
        UNION SELECT 48.0 AS dia 
        UNION SELECT 60.0 AS dia 
        UNION SELECT 76.0 AS dia 
        UNION SELECT 89.0 AS dia 
        UNION SELECT 114.0 AS dia 
        UNION SELECT 115.0 AS dia 
    ) AS tempT 
) 

SELECT TOP 1 * FROM 
(
    SELECT * FROM CTE as cte2
    WHERE cte2.dist = (SELECT MAX(ct3.DIST) FROM CTE as ct3 WHERE sig = -1 )

    UNION 

    SELECT * FROM CTE as cte2
    WHERE cte2.dist = (SELECT MIN(ct3.DIST) FROM CTE as ct3 WHERE sig = 1) 


    UNION 

    SELECT * FROM CTE AS cte2 
    WHERE cte2.dist = 0 
) AS o

ORDER BY 

CASE WHEN dist = 0 
    THEN 0
    ELSE 1
END
,absdist, sig