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个级别,那么递归就是了。或者这就是我到目前为止发现的。