如何获取层次结构的最后一个非空值?

时间:2013-05-27 13:50:02

标签: sql hierarchy flatten

我有一个层次结构,其中包含与每个级别相关联的适当值,让我们说:


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

(如有必要,已经完成了压缩层次结构的工作......)

提前谢谢!

1 个答案:

答案 0 :(得分: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()来创建模式。在某些数据库中,您可以使用+||代替。