找到最接近给定数字的范围

时间:2014-11-28 16:13:03

标签: sql-server

我有一张包含以下数据的表

id   range_min   range_max
1    1           10
2    4           7
3    5           10
4    5           5

我希望:

input   id
6       2
5       4
3       1

知道如何在MSSQL中执行此操作吗?

4 个答案:

答案 0 :(得分:1)

怎么样:

SELECT TOP 1 numbers.input, data.range_min AS id
FROM (
  SELECT numbers.input, data.range_min, data.range_max - data.range_min AS span
  FROM numbers, data  
  WHERE numbers.input >= data.range_min AND numbers.input <= data.range_max
)
ORDER BY span

您没有指定input的来源。我假设它来自一个表:numbers

input属于不同范围时,我选择了最紧密的范围(因此在span上排序,即max - min)。

答案 1 :(得分:0)

这显示了如何设置预期结果:

CREATE TABLE #temp
    (
      id INT IDENTITY(1, 1) ,
      range_min INT ,
      range_max INT
    )
INSERT  INTO #temp
        ( range_min, range_max )
VALUES  ( 1, 10 ),
        ( 4, 7 ),
        ( 5, 10 ),
        ( 5, 5 )

DECLARE @input INT = 6;
WITH    cte
          AS ( SELECT   id ,
                        range_min ,
                        range_max ,
                        RANK() OVER ( ORDER BY range_max - range_min ) AS tightness
               FROM     #temp
               WHERE    @input >= range_min
                        AND @input <= range_max
             )
    SELECT  id
    FROM    cte
    WHERE   cte.tightness = 1

更改@Input变量以查看不同的结果。这只使用&#34;紧密度&#34;找到最佳匹配的范围。如果你需要的东西除外,你应该在你的问题中清楚地列出。

答案 2 :(得分:0)

Declare @id int 

Select  top 1 *
From TableName
Where Rmin<=@id and RMax>=@id
Order by (@id-Rmin) + (RMax-@id)

答案 3 :(得分:-2)

试试这个

select count(id) as id from table where input>=range_min and input<=tange_max
相关问题