数据如下:id   name  value 
1     a     1.2
2     b     2.2
3     c     1.3
4     d     1.8
5     e     2.1给出任意一个值 a求与value 最接近的值。 也就是 |a-value| 绝对值最小的value.比如给的是: 1.5  它最接近的绝对值就是 1.3...想了很久,也不知道什么算法性能最高。。

解决方案 »

  1.   


    select [value] from tb where abs(1.5-value)=(select min(abs(1.5-value) from tb)
      

  2.   


    declare @f float
    set @f=1.5
    select * from tb where abs(value-@f)=(select min(abs(value-@f)) from tb) 
      

  3.   


    declare @f float
    set @f=1.5select * from tb t where not exists(select 1 from tb where abs(value-@f)<abs(t.value-@f))
      

  4.   

    if object_id('[tb]') is not null drop table [tb] 
     go 
    create table [tb]([id] int,[name] varchar(10),[value] dec(9,2))
    insert [tb] select 1,'a',1.2
    union all select 2,'b',2.2
    union all select 3,'c',1.3
    union all select 4,'d',1.8
    union all select 5,'e',2.1
    go
    --
    --select * from tb
    declare @f float
    set @f=1.5select top 1 * from tb t where [value]<>@f order by abs(@f-[value])
    /*
    id          name       value
    ----------- ---------- ---------------------------------------
    3           c          1.30(1 行受影响)
    */
      

  5.   

    DECLARE @T TABLE(id INT,  [name] VARCHAR(10),  value DEC(10,2)) 
    INSERT @T SELECT 1 ,   'a'  ,  1.2 
    INSERT @T SELECT 2 ,   'b'  ,  2.2 
    INSERT @T SELECT 3 ,   'c'   , 1.3 
    INSERT @T SELECT 4 ,   'd'   , 1.8 
    INSERT @T SELECT 5,    'e'    ,2.1 
    DECLARE @I DEC(10,2)
    SET @I=1.5
    SELECT * FROM @T ORDER BY ABS(@I-VALUE)
    /*id          name       value        
    ----------- ---------- ------------ 
    3           c          1.30
    4           d          1.80
    1           a          1.20
    5           e          2.10
    2           b          2.20(影響 5 個資料列)*/
    SELECT TOP 1 VALUE FROM @T ORDER BY ABS(@I-VALUE)
    /*VALUE        
    ------------ 
    1.30(影響 1 個資料列)
    */
      

  6.   

    DECLARE @i=1.5select top 1 * 
    from t 
    order by abs(@i-value)
      

  7.   

    DECLARE @input = 1.5
    select top 1 *  
    from LI 
    order by abs(@input - value) 
      

  8.   

    create table #tb ([id] int,[name] varchar(10),[value] dec(9,2))
    insert #tb select 1,'a',1.2
    union all select 2,'b',2.2
    union all select 3,'c',1.3
    union all select 4,'d',1.8
    union all select 5,'e',2.1
    declare @i decimal(19,2)
    set @i=1.5
    select top 1 * from #tb order by abs(@i-value) asc
      

  9.   

    性能没有最高 只有更高 
    不过最简单的还是楼上的
    select top 1 * from t order by abs(1.5-value) asc
      

  10.   

    declare @i decimal(19,2) 
    set @i=1.5 
    select top 1 * from #tb order by abs(@i-value) asc这个比较好,很容易修改
      

  11.   

    如果只有这么几条数据还讨论什么性能。所以采用top 1的办法是有点就事论事了。我的建议是在value字段建索引,查询时不要使用abs了采用value=@i+@minAbs or value=@i-@minAbs
      

  12.   

    说明,在我的机器上,5万条记录以内abs()要快一些,超过5万采用索引和value=@i+@minAbs or value=@i-@minAbs方法要快。数据量越大,后者的优势越明显。