英文:
Recursive Hierarchical - Google BigQuery
问题
注意:存在循环引用,必须在第一个“节点”处停止 - 注意:停止。
就像示例输出中一样。
-
有些情况下没有“节点”子级,这些用Flag = 2标记,注意:结束;
-
有些情况下“节点”父级也是子级。
-
对于每个条目ID,我们希望应用相同的逻辑。在这个输出示例中,使用了案例1010。
-
预期的输出可以是表格、列表等。
谢谢。
英文:
Note: There are circular references and these must be stopped at the first "node" - Note: Stop.
As in the example output.
-There are cases where there are no "nodes" children, these are marked with Flag = 2, Note: End;
-There are cases where the "node" Father is also a child.
-For each entry ID, we want to apply this same logic. In the example of this output, case 1010 was used.
-The expected output can be a table, list, etc.
Tks.
答案1
得分: 0
以下是您要翻译的代码部分:
WITH RECURSIVE sample_table AS (
-- put your *input* except *flag* here
),
find_ends AS (
SELECT DISTINCT t.*, IF(s.id IS NULL, true, false) AS ended
FROM sample_table t
LEFT JOIN sample_table s ON t.parent_id = s.id
),
iterations AS (
SELECT id, parent_id, [id, parent_id] ids, id = parent_id duplicated, ended
FROM find_ends WHERE id = '1010'
UNION ALL
SELECT t.id, t.parent_id,
r.ids || [t.parent_id],
t.parent_id IN UNNEST(r.ids),
t.ended
FROM iterations r JOIN find_ends t ON r.parent_id = t.id
WHERE duplicated IS FALSE AND r.ended IS FALSE
)
SELECT ids FROM iterations WHERE duplicated OR ended ORDER BY ARRAY_LENGTH(ids);
查询结果
+---------------------------------------------+
| ids |
+---------------------------------------------+
| "[1010,3021]" |
| "[1010,3020]" |
| "[1010,1012,2021]" |
| "[1010,1012,2020]" |
| "[1010,1012,1013,1012]" |
| "[1010,1012,1013,1018,5020]" |
| "[1010,1012,1013,1018,1015,6020]" |
| "[1010,1012,1013,1018,1020,1020]" |
| "[1010,1012,1013,1018,1015,6021]" |
| "[1010,1012,1013,1018,1016,4022]" |
| "[1010,1012,1013,1018,1015,1018]" |
| "[1010,1012,1013,1018,1016,1018]" |
| "[1010,1012,1013,1018,1016,1010]" |
| "[1010,1012,1013,1018,1015,1016,1018]" |
| "[1010,1012,1013,1018,1015,1020,1020]" |
| "[1010,1012,1013,1018,1015,1016,1010]" |
| "[1010,1012,1013,1018,1020,1015,1020]" |
| "[1010,1012,1013,1018,1020,1015,1018]" |
| "[1010,1012,1013,1018,1015,1016,4022]" |
| "[1010,1012,1013,1018,1020,1015,6020]" |
| "[1010,1012,1013,1018,1020,1015,6021]" |
| "[1010,1012,1013,1018,1015,1020,1015]" |
| "[1010,1012,1013,1018,1020,1015,1016,1018]" |
| "[1010,1012,1013,1018,1020,1015,1016,4022]" |
| "[1010,1012,1013,1018,1020,1015,1016,1010]" |
+---------------------------------------------+
如果您需要更多的帮助,请随时告诉我。
英文:
You can try below recursive approach.
WITH RECURSIVE sample_table AS (
-- put your *input* except *flag* here
),
find_ends AS (
SELECT DISTINCT t.*, IF(s.id IS NULL, true, false) AS ended
FROM sample_table t
LEFT JOIN sample_table s ON t.parent_id = s.id
),
iterations AS (
SELECT id, parent_id, [id, parent_id] ids, id = parent_id duplicated, ended
FROM find_ends WHERE id = '1010'
UNION ALL
SELECT t.id, t.parent_id,
r.ids || [t.parent_id],
t.parent_id IN UNNEST(r.ids),
t.ended
FROM iterations r JOIN find_ends t ON r.parent_id = t.id
WHERE duplicated IS FALSE AND r.ended IS FALSE
)
SELECT ids FROM iterations WHERE duplicated OR ended ORDER BY ARRAY_LENGTH(ids);
Query results
+---------------------------------------------+
| ids |
+---------------------------------------------+
| "[1010,3021]" |
| "[1010,3020]" |
| "[1010,1012,2021]" |
| "[1010,1012,2020]" |
| "[1010,1012,1013,1012]" |
| "[1010,1012,1013,1018,5020]" |
| "[1010,1012,1013,1018,1015,6020]" |
| "[1010,1012,1013,1018,1020,1020]" |
| "[1010,1012,1013,1018,1015,6021]" |
| "[1010,1012,1013,1018,1016,4022]" |
| "[1010,1012,1013,1018,1015,1018]" |
| "[1010,1012,1013,1018,1016,1018]" |
| "[1010,1012,1013,1018,1016,1010]" |
| "[1010,1012,1013,1018,1015,1016,1018]" |
| "[1010,1012,1013,1018,1015,1020,1020]" |
| "[1010,1012,1013,1018,1015,1016,1010]" |
| "[1010,1012,1013,1018,1020,1015,1020]" |
| "[1010,1012,1013,1018,1020,1015,1018]" |
| "[1010,1012,1013,1018,1015,1016,4022]" |
| "[1010,1012,1013,1018,1020,1015,6020]" |
| "[1010,1012,1013,1018,1020,1015,6021]" |
| "[1010,1012,1013,1018,1015,1020,1015]" |
| "[1010,1012,1013,1018,1020,1015,1016,1018]" |
| "[1010,1012,1013,1018,1020,1015,1016,4022]" |
| "[1010,1012,1013,1018,1020,1015,1016,1010]" |
+---------------------------------------------+
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论