如何在SQL Server中的值列表中找到匹配项,向下舍入到最接近的匹配项

时间:2012-09-27 00:49:14

标签: sql sql-server

我知道SQL Server中的ABS和Round函数,但我相信我的问题有点不同,我不知道如何使用它们来实现所需的结果。

说我有一个号码:8000

我有一个返回此数字列表的查询:0,5000,10000,15000

如果我将ABS功能与此列表一起使用,例如

DECLARE @target as INT
SET @target = 8000
SELECT TOP(1) @result AS Number
FROM dbo.Numbers
ORDER BY ABS(Number - @target)

我得到10000

预期

但是我怎么能让这个返回5000,即我总是将结果四舍五入?

2 个答案:

答案 0 :(得分:1)

了解您的问题意味着您想要最近的匹配而不会过去:

添加WHERE Number <= @target

答案 1 :(得分:1)

试试这个:

...
WHERE Number <= @target
ORDER BY Number DESC

我们只是得到第一个数字(ORDER BY Number DESC)不大于@target(WHERE Number <= @target)。

ABS中丢失ORDER BY的好处是,DBMS现在应该可以使用Number上的索引(如果有的话)。