Sql BigQuery中树结构的深度

Sql BigQuery中树结构的深度,sql,google-bigquery,Sql,Google Bigquery,我的数据如下所示: | child_id | parent_id | | 10 | Null | | 13 | 10 | | 15 | 13 | | 11 | 10 | | 16 | 11 | | 19 | 15 | 这可以看作是一棵树。现在我想确定每个子id的深度。因此示例应该是: | child_id | parent_id | dept

我的数据如下所示:

| child_id | parent_id |
|    10    |    Null   |
|    13    |     10    |
|    15    |     13    |
|    11    |     10    |
|    16    |     11    |
|    19    |     15    |
这可以看作是一棵树。现在我想确定每个子id的深度。因此示例应该是:

| child_id | parent_id |  depth  |
|    10    |    Null   |    0    |
|    13    |     10    |    1    |
|    15    |     13    |    2    |
|    11    |     10    |    1    |
|    16    |     11    |    2    |
|    19    |     15    |    3    |

我想在BigQuery中解决这个问题;我不确定怎么做,因为我不认为可以轻松地使用递归。也许以某种方式将其传递给UDF可能是一种合理的方法。

我刚刚使用刚刚发布的“BigQuery上的完整黑客新闻数据集”为此编写了一个查询

这里的问题是,一些注释指向父故事,而其他注释发布到父注释,并且通过它们搜索原始故事很困难(因为这是一个递归操作)。通过以下方式解决:

  SELECT p0.id, s.id, s.title, level
  FROM (
    SELECT p0.id, p0.parent, p2.id, p3.id, p4.id, COALESCE(p7.parent, p6.parent, p5.parent, p4.parent, p3.parent, p2.parent, p1.parent, p0.parent) story_id,
           GREATEST(IF(p7.parent IS null, -1, 7), IF(p6.parent IS null, -1, 6), IF(p5.parent IS null, -1, 5), IF(p4.parent IS null, -1, 4), IF(p3.parent IS null, -1, 3),
                    IF(p2.parent IS null, -1, 2), IF(p1.parent IS null, -1, 1), 0) level
    FROM    [fh-bigquery:hackernews.comments] p0
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p1 ON p1.id=p0.parent
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p2 ON p2.id=p1.parent
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p3 ON p3.id=p2.parent
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p4 ON p4.id=p3.parent
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p5 ON p5.id=p4.parent
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p6 ON p6.id=p5.parent
    LEFT JOIN EACH [fh-bigquery:hackernews.comments] p7 ON p7.id=p6.parent
    HAVING level=0
    LIMIT 100
  ) a
  LEFT JOIN EACH [fh-bigquery:hackernews.stories] s
  ON s.id=a.story_id
(有如此多的左连接会消耗大量资源,因此要大规模运行它,我会寻找不同的策略)


这需要一个预定义的深度量……这能更一般地解释每个深度吗?由于树遍历算法是递归的,您需要递归地运行同一个查询七次,或者编写一个在一次运行中深入七层的查询。但是如果你需要超过x个级别,那么递归就是了。或者这就是我到目前为止发现的。