我有一张表有一些数值(直径) 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中的用户表单中。
谢谢!
答案 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