2012-06-06 144 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