首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tsql -在查找中匹配到最接近的数字

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

Stack Overflow用户
提问于 2012-05-02 23:28:29
回答 3查看 905关注 0票数 0

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

e.g

对于USD,我有一个0.20的持续时间,所以从下面的查询表中可以看出,这个查询表是从这个代码派生出来的:

代码语言:javascript
复制
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'

这将返回:

代码语言:javascript
复制
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作为我的收益率。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-03 11:06:11

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2012-05-02 23:35:12

我现在不能测试/验证这一点,但似乎您可以使用min或order by,根据给定值和表值之间的绝对差值选择前1。

票数 0
EN

Stack Overflow用户

发布于 2012-05-02 23:37:03

一种快捷的方法来实现这一点:

代码语言:javascript
复制
SELECT fld1_val
FROM table
WHERE (abs(mrkt_cap_wght - 0.25)) = (SELECT MIN(abs(mrkt_cap_wght - 0.25)) FROM table);

我在另一张桌子上测试过它,它肯定可以工作,但无可否认,它感觉有点笨拙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10416865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档