Sql server 2008 tsql-匹配查找中最接近的数字

Sql server 2008 tsql-匹配查找中最接近的数字,sql-server-2008,tsql,lookup,Sql Server 2008,Tsql,Lookup,我有一个返回持续时间值的select。我想做的是在查找表中查找这个值,并返回一个最接近这个持续时间值的收益率值 e、 g 我的美元期限为0.20美元,因此从我的下表中可以看出,下表是根据本代码得出的: select fld1_val, mrkt_cap_wght from dw_iss_indx_cnstnt AS ai WITH (NOLOCK) INNER JOIN dw_issue_dg AS i WITH (NOLOCK) ON ai.indx_instr_id = i.inst

我有一个返回持续时间值的select。我想做的是在查找表中查找这个值,并返回一个最接近这个持续时间值的收益率值

e、 g

我的美元期限为0.20美元,因此从我的下表中可以看出,下表是根据本代码得出的:

select fld1_val, mrkt_cap_wght from dw_iss_indx_cnstnt AS ai WITH (NOLOCK)

INNER JOIN  dw_issue_dg AS i WITH (NOLOCK)
  ON ai.indx_instr_id = i.instr_id 
  AND ai.as_of_dte > getdate()-2

INNER JOIN dw_issue_alt_id AS ia WITH (NOLOCK)
  on ia.instr_id = ai.indx_instr_id
  AND id_ctxt_typ = 'Bloomberg ID'
  AND denom_curr_cde = 'USD'
这将返回:

fld1_val    mrkt_cap_wght
0.08        5.0168
0.25        5.03
0.5         5.09
1           5.21
2           5.2
5           5.51
10          5.67
12          5.69
15          5.7
20          5.71
所以我要做的是查找这个,因为0.20最接近于0.25,所以我会返回5.03作为我的收益率


但是,我不确定如何执行此操作,因为查找并不是寻找精确的匹配,而是最接近的值。知道我该怎么做吗?

我现在无法测试/验证这一点,但您似乎可以使用
min
或一个顺序,根据给定值和表值之间的绝对差值选择前1

一种快速而肮脏的方法:

SELECT fld1_val
FROM table
WHERE (abs(mrkt_cap_wght - 0.25)) = (SELECT MIN(abs(mrkt_cap_wght - 0.25)) FROM table);

我在另一个表上测试过它,它确实有效,但无可否认它感觉有点笨拙。

是否
选择top 1
order by abs(col-value)
为您指出了正确的方向?谢谢,我将它放在一个临时表中,然后与我的工作表交叉应用,以输入我所需的数字。
DECLARE @Dur decimal(5,2)=0.20;

select TOP 1 fld1_val, mrkt_cap_wght from dw_iss_indx_cnstnt AS ai WITH (NOLOCK)

INNER JOIN  dw_issue_dg AS i WITH (NOLOCK)
  ON ai.indx_instr_id = i.instr_id 
  AND ai.as_of_dte > getdate()-2

INNER JOIN dw_issue_alt_id AS ia WITH (NOLOCK)
  on ia.instr_id = ai.indx_instr_id
  AND id_ctxt_typ = 'Bloomberg ID'
  AND denom_curr_cde = 'USD'
ORDER BY ABS(@Dur-fld1_val)