2012-06-06 142 views
1

假設我有一個表格,它具有表示檢索數據的日期的「CDATE」,標識我檢索數據的安全性的「SECID」,指示我獲取數據的位置的「SOURCE」和我從源頭獲得的「價值」。我的數據可能看起來如下:在SQL中實現層次結構

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 

假設我有一個層次結構表如下內容(「源」與最大等級編號優先):

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

現在假設我希望我的結果根據上面的層次結構挑選。所以應用教主,並與我想有以下落得最大等級編號選擇來源:

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

你只是缺少按排序desc排序嗎? – Limey

+0

另請參見http://msdn.microsoft.com/zh-cn/library/bb677290.aspx在sql 2008中進行hierarchyid –

回答

2

此加入您的層次結構,並選擇每個日期和安全排名第一的來源。

SELECT CDATE, SECID, SOURCE, VALUE 
FROM (
    SELECT t.CDATE, t.SECID, t.SOURCE, t.VALUE, 
    ROW_NUMBER() OVER (PARTITION BY t.CDATE, t.SECID 
         ORDER BY h.HIERARCHY DESC) as nRow 
    FROM table1 t 
    INNER JOIN table2 h ON h.SOURCE = t.SOURCE 
) A 
WHERE nRow = 1 
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