2012-05-02 11 views
0

私は期間値を返すselectを持っています。私がしたいのは、ルックアップテーブルでこの値をルックアップし、この期間値に最も近いyieldの値を返します。tsql - 検索で最も近い数字に一致する

例えば

このコードから派生しているの下に私のルックアップテーブルからだから私は、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を私の歩留まりとして返すだろう。

しかし、私はルックアップが正確に一致するものを探しているわけではないので、これを行う方法がわかりません。どのように私はこれを行うことができる任意のアイデア?

+1

「選択トップ1」と「abs(col-value)による並べ替え」は正しい方向を指していますか? – HABO

答えて

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) 
+0

これをありがとう、私は一時的なテーブルに入れて、私は必要な数字にドロップするために私の作業台に適用クロス。 –

0

私はこの時点でテスト/検証することができませんが、minを使用するか、指定された値とテーブル値の絶対差に対してトップ1を選択して注文することができます。これを行うには

0

ワン間に合わせとウェイ:

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

私は別のテーブルの上にそれをテストしてみたし、それは間違いなく動作しますが、それは確かに少し不器用な感じ。

関連する問題