在SQL中实现层次结构
假设我有一个表,其中有一个“CDATE”表示我检索数据的日期,一个“SECID”标识我检索数据的安全性,一个“SOURCE”标识我从何处获取数据以及从源中获取的“VALUE”。我的数据可能如下所示:在SQL中实现层次结构,sql,sql-server,Sql,Sql Server,假设我有一个表,其中有一个“CDATE”表示我检索数据的日期,一个“SECID”标识我检索数据的安全性,一个“SOURCE”标识我从何处获取数据以及从源中获取的“VALUE”。我的数据可能如下所示: CDATE | SECID | SOURCE | VALUE -------------------------------- 1/1/2012 1 1 23 1/1/2012 1 5 45 1/1/2012 1
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
CDATE | SECID | SOURCE | VALUE
---------------------------------
1/1/2012 1 1 23
1/4/2012 2 5 55
1/5/2012 1 3 99
假设我有一个如下所示的层次结构表(“源”具有最大的层次结构编号优先):
现在让我们假设我希望根据上面的层次结构选择结果。因此,应用层次结构并选择具有最大层次编号的源,我希望以以下内容结束:
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
CDATE | SECID | SOURCE | VALUE
---------------------------------
1/1/2012 1 1 23
1/4/2012 2 5 55
1/5/2012 1 3 99
这将加入您的层次结构,并为每个日期和安全性选择排名靠前的源
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
你可以通过下面的方法得到你想要的结果。它将数据与层次结构相结合,并根据最高层次结构对它们进行排序。如果在同一日期重复了一个源,那么这只会任意返回一个结果
;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
您只是缺少了按层次结构进行排序的描述?还可以查看sql 2008中的hierarchyid,它可能应该按CDATE和SECIDYeah进行分区,这是有意义的。与最初的问题相比有点模棱两可。