0

期間の値を返すselectがあります。私がやりたいのは、ルックアップテーブルでこの値を検索し、この期間の値に最も近いyieldの値を返すことです。

例えば

私は米ドルで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

これを行うための1つの迅速で汚い方法:

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 に答える
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 に答える