2012-05-02 2 views
0

У меня есть выбор, который возвращает значение продолжительности. то, что я хотел бы сделать, это найти это значение в таблице поиска и вернуть значение для доходности, которое ближе всего к этому значению продолжительности.tsql - совпадение до ближайшего числа в поиске

например

я иметь продолжительность 0,20 для USD, так от моего взгляда на таблицу ниже, полученный из этого кода:

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

Выполняет 'select top 1' и' order by 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); 

Я проверил его на другой стол, и это, безусловно, работает, но это правда, чувствует себя немного неуклюжим.

Смежные вопросы