我们可以使用分析函数来检索层次结构中的父项和子项吗?

时间:2018-06-03 10:03:40

标签: sql sql-server recursion hierarchical-data analytic-functions

我有以下数据(实际数据的样本,它更大):

id p_id
1  null
2  1
3  1
4  2
5  4
6  5
7  5
8  3
9  7

是否可以使用SQL Server的分析功能获得以下结果(获得最深层次结构):

id p_id
1  null
2  1
4  2
5  4
7  5
9  7

我可以使用递归CTE来获取每个ID的级别,但我尝试使用分析函数。我怀疑我需要使用Lag或Lead函数,但我是分析函数的新手,所以如果可以这样做,请帮助分享解决方案。非常感谢您的帮助!感谢。

1 个答案:

答案 0 :(得分:2)

让我发布这个答案而不是评论。

不,您不能将分析功能用于此目的。通过分析函数,您可以汇总有关已知记录组的数据。摘要可能非常奇特 - 例如部分总和或计算百分位数或获取组中的先前记录。但是,“组”是在窗口条款中静态定义的。

也就是说,可以表示分层数据,因此这是可能的。我们的想法是包含每个元素的完整路径:

id parent_path
1  /1
2  /1/2
3  /1/3
4  /1/2/4
5  /1/2/4/5
6  /1/2/4/5/6
7  /1/2/4/5/7
8  /1/3/8
9  /1/2/4/5/7/9

使用此表示,可以使用窗口函数来获取“1”的所有子项。也就是说,根本不需要窗口功能。一个简单的like表达式可以运行:parent_path like '/1/%'

这种数据结构的挑战是设置触发器来维护它(绝对可能,只需要一些工作)。