2012-05-02 4 views
0

나는 duration 값을 반환하는 select를가집니다. 내가 뭘하고 싶습니다 조회 테이블 에서이 값을 조회 하고이 기간 값에 가장 가까운 항복에 대한 값을 반환합니다.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.22가 0.25에 가장 가깝기 때문에 나는 이것에 대한 검색을 할 것이고, 5.03을 내 수율로 반환 할 것이기 때문이다.

그러나 조회가 정확한 값을 찾지 않고 값에 가장 근접한 값을 찾기 때문에이 작업을 수행하는 방법이 확실하지 않습니다. 어떻게 내가 이걸 할 수 있었는지 알았어?

+1

'선택 상위 1'및 '복근 순 (col - 값)'은 올바른 방향으로 가리 킵니까? – 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); 

나는 다른 테이블에 그것을 테스트했고 그것은 확실히 작동하지만, 그것은 틀림없이 조금 서투른 느낌.