2012-06-06 3 views
1

데이터를 검색 한 날짜를 나타내는 "CDATE", 데이터를 검색 한 보안을 식별하는 "SECID", 데이터를 가져온 위치를 지정하는 "SOURCE"및 내가 소스에서 얻은 "VALUE". 이제SQL에서 계층 구조 구현

SOURCE | NAME | HIERARCHY 
--------------------------- 
    1  ABC  10 
    3  DEF  5 
    5  GHI  2 

을의 나는 내 결과를한다고 가정하자 :

나는 다음과 같은 계층 구조 테이블이 있다고 가정
CDATE | SECID | SOURCE | VALUE 
-------------------------------- 
1/1/2012 1  1  23 
1/1/2012 1  5  45 
1/1/2012 1  3  33 
1/4/2012 2  5  55 
1/5/2012 1  5  54 
1/5/2012 1  3  99 

(최대 HIERARCHY 번호 "SOURCE"가 우선) : 내 데이터는 다음과 같이 보일 수 있습니다 위의 계층 구조에 따라 선택해야합니다. 그래서 hierarch을 적용하고 난 다음에 결국하고 싶은 가장 큰 HIERARCHY 번호와 소스를 선택 :

CDATE | SECID | SOURCE | VALUE 
--------------------------------- 
1/1/2012 1  1  23 
1/4/2012 2  5  55 
1/5/2012 1  3  99 
+0

계층 구조 내림차순 정렬이 누락 되었습니까? – Limey

+0

SQL2005에서 hierarchyid에 대한 http://msdn.microsoft.com/en-us/library/bb677290.aspx를 참조하십시오. –

답변

2

이 계층 구조에 결합하고 각 날짜 및 보안에 대한 최고 순위 소스를 선택합니다.

1

아래에서 원하는 결과를 얻을 수 있습니다. 데이터를 계층 구조와 결합하고 최상위 계층 구조에 따라 순위를 매 깁니다. 같은 날짜에 소스가 반복되는 경우에만 하나의 결과 만 임의로 반환합니다.

;with rankMyData as (
    select 
     d.CDATE 
    , d.SECID 
    , d.SOURCE 
    , d.VALUE 
    , row_number() over(partition by d.CDate, d.SECID order by h.HIERARCHY desc) as ranking 
    from DATA d 
     inner join HIERARCHY h 
     on h.source = d.source 
) 
SELECT 
    CDATE 
, SECID 
, SOURCE 
, VALUE 
FROM rankMyData 
where ranking = 1 
+0

은 CDATE 및 SECID로 파티션해야합니다. – Denis

+0

그래, 맞는 말입니다. 원래의 질문과 조금 모호했습니다. – Zhenny