我有一个select语句,它返回一个持续时间值。我想要做的是在一个查找表中查找这个值,并返回一个与这个持续时间值最接近的收益率值。
e.g
对于USD,我有一个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作为我的收益率。
然而,我不确定如何做到这一点,因为查找不是寻找一个精确的匹配,只是最接近的值。你知道我该怎么做吗?
发布于 2012-05-03 11:06:11
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-02 23:35:12
我现在不能测试/验证这一点,但似乎您可以使用min或order by,根据给定值和表值之间的绝对差值选择前1。
发布于 2012-05-02 23:37:03
一种快捷的方法来实现这一点:
SELECT fld1_val
FROM table
WHERE (abs(mrkt_cap_wght - 0.25)) = (SELECT MIN(abs(mrkt_cap_wght - 0.25)) FROM table);我在另一张桌子上测试过它,它肯定可以工作,但无可否认,它感觉有点笨拙。
https://stackoverflow.com/questions/10416865
复制相似问题