Определить иерархию в Redshift SQL - PullRequest
0 голосов
/ 29 января 2020

Есть ли способ идентифицировать иерархии по набору отношений узлов?

--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

1 Ответ

1 голос
/ 29 января 2020

ОК, я думаю, что у меня есть базовая c версия запроса, которая не использует 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
...