我有以下数据(实际数据的样本,它更大):
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函数,但我是分析函数的新手,所以如果可以这样做,请帮助分享解决方案。非常感谢您的帮助!感谢。
答案 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/%'
。
这种数据结构的挑战是设置触发器来维护它(绝对可能,只需要一些工作)。