0

我正在寻找基于两个坐标的最接近的坐标集,对照表中的任何坐标集。

我有一个包含 5 列数据的表。colB并且colC具有非连续值。

colB             colC

12.54         -87.36
41.25          68.56
55.98         -82.45
40.12          78.52

colA是主键

我需要将两个值传递给查询,例如colB值 40.81 和值 75.56 colC

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

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

4

2 回答 2

1

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

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
于 2012-11-28T20:16:08.507 回答
0

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

DECLARE @value float = 40.81;

SELECT TOP 1 *
FROM MyTable m
ORDER BY ABS(colB-@value);
于 2012-11-28T20:14:45.963 回答