sql - 识别 Redshift SQL 中的层次结构
问题描述
有没有办法在给定一组节点关系的情况下识别层次结构?
--input/existing table
select 'W' as edition, 'X' as new_edition
union
select 'Y' as edition, 'Z' as new_edition
union
select 'Z' as edition, null as new_edition
union
select 'X' as edition, 'Y' as new_edition;
--expected output
select 'W' as all_editions, 'Z' as latest_edition, 3 as level
union
select 'X' as all_editions, 'Z' as latest_edition, 2 as level
union
select 'Y' as all_editions, 'Z' as latest_edition, 1 as level
union
select 'Z' as all_editions, 'Z' as latest_edition, 0 as level;
如果可以动态识别级别,那就太好了,但是我们将拥有的最大级别是 10。这应该涵盖可能有 2 个新版本 X、X2 链接到 W 的边缘情况
解决方案
好的,我想我有一个不使用 CTE 的基本版本的查询。它看起来并没有我想象的那么糟糕。
这是一个 6 级层次结构:
select
e1,
coalesce(e6, e5, e4, e3, e2, e1) as latest_edition,
case when e2 is null then 0
when e3 is null then 1
when e4 is null then 2
when e5 is null then 3
when e6 is null then 4
else 5
end as level
from (
select
t1.edition as e1, t2.edition as e2, t3.edition as e3,
t4.edition as e4, t5.edition as e5, t6.edition as e6
from my_table t1
left join my_table t2 on t2.edition = t1.new_edition
left join my_table t3 on t3.edition = t2.new_edition
left join my_table t4 on t4.edition = t3.new_edition
left join my_table t5 on t5.edition = t4.new_edition
left join my_table t6 on t6.edition = t5.new_edition
) x
推荐阅读
- java - Android 房间查询返回 null
- phpunit - 如何在 Symfony 3.4 的单元测试中使用数据库中的数据?
- php - php的智能高亮功能
- java - 如何创建允许用户从 Java 列表中选择某些元素的弹出菜单?
- java - 如何在 Java 中从另一个包和文件夹导入类?
- ajax - JSF:如何在父元素的复合组件中获取 id
- svelte - 如何在 Svelte 3 中有条件地添加和删除`use:`属性?
- c# - WPF 验证错误消息在字段有效之前不会触发
- java - 从 Firebase 获取数据并同时将其放在那里
- javascript - 如何将 Puppeteer“页面”实例传递给 Mocha 自定义报告?