Как я могу добиться этого? - PullRequest
0 голосов
/ 07 февраля 2020

Ниже приведен набор данных

P1      A1      N1

null    null    0
2776646 2776621 1
2776646 2776622 2
2776642 2776645 3
2776642 2776648 4
2776642 2776649 5
2776642 2776647 6
2776642 2776646 7
0       2776641
0       2776642

Мне нужно добавить еще один столбец, который будет называться parent_n1, и он будет иметь значения в N1, которые принадлежат родителю (P1) в A1. Например:

Для A1.2776621 P1 = 2776646 и в A1 2776646 = N1.7, поэтому parent_n1 для этой строки становится равным 7. Аналогичным образом запрос должен возвращать следующий вывод для каждой строки:

P1      A1      N1  Parent_N1

null    null    0   0
2776646 2776621 1   7
2776646 2776622 2   7
2776642 2776645 3   9
2776642 2776648 4   9
2776642 2776649 5   9
2776642 2776647 6   9
2776642 2776646 7   9
0       2776641 8   0
0       2776642 9   0

Любая помощь будет оценена здесь.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

Вы можете самостоятельно присоединиться к таблице:

select
    t.*,
    coalesce(p.n1, 0) parent_n1
from mytable t
left join mytable p on p.a1 = t.p1

Демонстрация на DB Fiddle :

     P1 |      A1 | N1 | PARENT_N1
------: | ------: | -: | --------:
   <em>null</em> |    <em>null</em> |  0 |         0
2776646 | 2776621 |  1 |         7
2776646 | 2776622 |  2 |         7
2776642 | 2776645 |  3 |         9
2776642 | 2776648 |  4 |         9
2776642 | 2776649 |  5 |         9
2776642 | 2776647 |  6 |         9
2776642 | 2776646 |  7 |         9
      0 | 2776641 |  8 |         0
      0 | 2776642 |  9 |         0
0 голосов
/ 07 февраля 2020

Я думаю, что это то, что вы хотите:

with newt as (
      select t.*,
             coalesce(n1,
                      (max(n1) over () +
                       row_number() over (partition by n1 order by a1)
                      )
                     ) as new_n1
      from t
     )
select newt.*, tp.new_n1 as parent_n1
from newt left join
     newt newtp
     on newt.p1 = newtp.a1;
...