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

时间:2012-05-02 15:28:29

标签: sql-server-2008 tsql lookup

我有一个返回持续时间值的选择。我想要做的是在查找表中查找此值并返回最接近此持续时间值的yield的值。

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作为我的收益。

但是我不确定如何做到这一点,因为查找不是寻找完全匹配,只是最接近值。知道我怎么能这样做吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这样做的一种快捷方式:

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

我已经在另一张桌子上测试了它,它确实有效,但它确实感觉有点笨拙。

答案 2 :(得分:0)

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)