0

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

例如

我的美元持续时间为 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 作为我的收益。

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

4

3 回答 3

0

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

于 2012-05-02T15:35:11.537 回答
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)
于 2012-05-03T03:06:11.403 回答
0

一种快速而肮脏的方法:

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

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

于 2012-05-02T15:37:02.603 回答