用于查找值的下一个和上一个记录的T-SQL查询

时间:2012-11-28 20:01:59

标签: sql-server-2008 tsql

我希望根据两个坐标检查最接近的坐标集,与表格中的任何一组坐标进行对比。

我有一个包含5列数据的表。 colBcolC具有非连续值。

colB             colC

12.54         -87.36
41.25          68.56
55.98         -82.45
40.12          78.52

colA是主键

我需要向查询传递两个值,例如colB值为40.81,colC值为75.56。

然后确定四个值之差的最接近记录。在此示例中,colB的rec 2和4之间的差异将根据传入的值40.81进行检查。因此,41.25 - 40.81 = .44和40.81 - 40.12 = .69所以在这种情况下,记录2更接近,我需要返回记录2的所有字段。

如果有人可以帮助我接近解决这个T-SQL查询,我想我可以完成要求的下一部分,重复colC值的过程。

3 个答案:

答案 0 :(得分:1)

我会这样做 - 但我得到的结果是最接近的:

declare @example table 
(
    colA bigint not null identity(1,1) primary key clustered
    , colB numeric(18,9)
    , colC numeric(18,9)
)

insert @example select 12.54, -87.36
insert @example select 41.25,  68.56
insert @example select 55.98, -82.45
insert @example select 40.12,  78.52

declare @B numeric(18,9) =  40.81 
, @C numeric(18,9) = 75.56

select top 1 *
from @example
order by power(@B - colB, 2) + power(@C - colC, 2)

<强>替代 以上为您提供了B和C中最小差异的记录。如果您想要B或C中的最小差异,请使用以下内容:

select top 1 *
from @example
order by 
    case 
        when abs(@B - colB) < abs(@C - colC) 
            then abs(@B - colB) 
        else 
            abs(@C - colC) 
    end

答案 1 :(得分:0)

我假设您的列的数据类型为float。您要查找的是传入值与colB值之差的最低绝对值。这是我的简单解决方案,可能不是最高效的:

DECLARE @value float = 40.81;

SELECT TOP 1 *
FROM MyTable m
ORDER BY ABS(colB-@value);

答案 2 :(得分:0)