【问题标题】:Can we use analytic functions to retrieve parents and child in hierarchy?我们可以使用分析函数来检索层次结构中的父母和孩子吗?
【发布时间】:2018-11-12 21:08:27
【问题描述】:

我有以下数据(真实数据样本,要大得多):

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 函数,但是我是分析函数的新手,所以如果可以这样做,请帮助分享解决方案。感谢您的帮助!谢谢。

【问题讨论】:

  • 我不确定你是否可以使用laglead,不可以。不过,这可能对您来说是一些有趣的阅读:sqlservercentral.com/articles/Hierarchy/94040
  • @Leo 。 . .不,您不能为此目的使用分析函数。
  • 不,您的父/子实现需要递归。如果级别数已知且很小,您可以对 n 级别使用 n-1 左连接加上 COALESCE

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


【解决方案1】:

让我将其发布为答案而不是评论。

不,您不能为此目的使用分析函数。分析函数可让您汇总有关已知记录组的数据。摘要可能非常奇特——例如部分总和或计算百分位数或获取组中的先前记录。但是,“组”是在窗口子句中静态定义的。

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

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/%'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多