2013-05-27 72 views
0

我有與鏈接到每個級別的相應值的層次結構,讓我們說:如何獲取層次結構的最後一個非空值?


A    100 
    A1   NULL 
    A2   NULL 
B 
    B1   NULL 
    B2   1000 
     B21  500 
     B22  500 
    B3   NULL 

此層次結構在我的數據庫爲父子層次化


Hierarchy Table 
------------------------ 
Id  Code  Parent_Id 
1   A   NULL 
2   A1   1 
3   A2   3 
4   B   NULL 
5   B1   4 
6   B2   4 
7   B21   6 
8   B22   6 
9   B3   4 

這裏是我的事實表:


Fact Table 
------------------------ 
Hierarchy_Id   Value 
1      100 
6      1000 
7      500 
8      500 

我的問題是:你知不知道/有一個如何得到我的hiearchy的只有最後一個非空值的任何想法? 我知道那裏有一個MDX函數可以完成這項工作,但我想以另一種方式做到這一點。

需要明確的是,所需的輸出將是:


Fact Table 
------------------------ 
Hierarchy_Id   Value 
1      100 
7      500 
8      500 

(如果必要的話,扁平化層級的工作已經完成...)

預先感謝您!

回答

0

如果您的層次結構代碼是正確的,那麼您可以使用代碼中的信息來確定層次結構的深度。我認爲你想過濾出任何「代碼」,在那裏有一個更長的代碼開始。

在這種情況下:

select f.* 
from fact f join 
    hierarchy h 
    on f.hierarchyId = h.hierarchyId 
where not exists (select 1 
        from fact f2 join 
         hierarchy h2 
         on f2.hierarchyId = h2.hierarchyId 
        where h2.code like concat(h.code, '%') and 
         h2.code <> h.code 
       ) 

在這裏,我使用的功能concat()創建模式。在某些數據庫中,您可以使用+||

+0

謝謝你的回答,但我不能基於我的查詢代碼。但是如果你認爲層次結構的深度,我可以在層次結構表中添加一列。 – stormblow

+0

@stormblow。 。 。這很遺憾,因爲這個問題包含了代碼,它非常有用。生成代碼需要迭代或遞歸查詢,這些查詢高度依賴於數據庫。深度不夠,你需要整個層次結構。 –

相關問題