Получить последнюю запись после заказа столбцов на основе последовательности - PullRequest
1 голос
/ 13 февраля 2020

Я хотел бы заказать свою таблицу, используя два столбца в порядке последовательности:

Текущий баланс, который должен начинаться как предыдущий баланс в следующей строке.

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

ID_DATE     PREV_BAL    CURR_BAL
20200201,   157,        192
20200201,   192,        195
20200201,   123,        124
20200201,   124,        157
20200201,   125,        123

И я хочу, чтобы они были заказаны первыми в следующей последовательности

enter image description here

Затем выберите самый верхний ряд в качестве моего окончательного результата, т.е.

ID_DATE     PREV_BAL    CURR_BAL
20200201,   192,        195

Любая помощь

with da as (
    select 20200201 id_date, 157 prev_bal, 192 curr_bal from dual
    union all select 20200201 id_date, 192 prev_bal, 195 curr_bal from dual
    union all select 20200201 id_date, 123 prev_bal, 124 curr_bal from dual
    union all select 20200201 id_date, 124 prev_bal, 157 curr_bal from dual
    union all select 20200201 id_date, 125 prev_bal, 123 curr_bal from dual
)
SELECT * FROM da

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

Это иерархия , вы можете увидеть весь цикл выполнения этого запроса:

select da.*, sys_connect_by_path(curr_bal, ' - ') path
  from da 
  connect by prior prev_bal = curr_bal 
  start with not exists (select 1 from da t where t.prev_bal = da.curr_bal)      

 ID_DATE   PREV_BAL   CURR_BAL PATH
-------- ---------- ---------- -------------------------------
20200201        192        195  - 195
20200201        157        192  - 195 - 192
20200201        124        157  - 195 - 192 - 157
20200201        123        124  - 195 - 192 - 157 - 124
20200201        125        123  - 195 - 192 - 157 - 124 - 123

Но если вы хотите, чтобы только большинство родительских строк просто использовали запрос Teja sh или not in или not exists:

select * from da 
  where not exists (select 1 from da t where t.prev_bal = da.curr_bal)

Если вы хотите go в другом направлении через все дерево, как описано в вашем вопросе, измените connect by clause и возьмите ряд листьев ( s) :

select da.*, sys_connect_by_path(curr_bal, ' - ') path
  from da 
  where connect_by_isleaf = 1
  connect by prev_bal = prior curr_bal 
  start with not exists (select 1 from da t where da.prev_bal = t.curr_bal)

dbfiddle

1 голос
/ 13 февраля 2020

Это был простой вопрос, просто используйте запрос ниже

SELECT * FROM ( 
with da as (
    select 20200201 id_date, 157 prev_bal, 192 curr_bal from dual
    union all select 20200201 id_date, 192 prev_bal, 195 curr_bal from dual
    union all select 20200201 id_date, 123 prev_bal, 124 curr_bal from dual
    union all select 20200201 id_date, 124 prev_bal, 157 curr_bal from dual
    union all select 20200201 id_date, 125 prev_bal, 123 curr_bal from dual
)
SELECT * FROM da ORDER BY prev_bal DESC  )
WHERE rownum=1 ORDER BY curr_bal DESC
1 голос
/ 13 февраля 2020

Я бы предложил сделать self outer join и взять запись, где она не может найти ни одной записи. CURR_BAL имеет запись с таким же PREV_BAL.

Я не знаю, поможет ли это вам или нет, но дает нужный ответ

Что-то вроде следующего:

with da as (
      select 20200201 id_date, 157 prev_bal, 192 curr_bal from dual
      union all select 20200201 id_date, 192 prev_bal, 195 curr_bal from dual
      union all select 20200201 id_date, 123 prev_bal, 124 curr_bal from dual
      union all select 20200201 id_date, 124 prev_bal, 157 curr_bal from dual
      union all select 20200201 id_date, 125 prev_bal, 123 curr_bal from dual
 )
 -- Your query starts from here
 SELECT
      ID_DATE, PREV_BAL, CURR_BAL
 FROM
     (
          SELECT
              D.*, P.ID_DATE   AS P_ID_DATE
          FROM
              DA D LEFT JOIN DA P ON D.CURR_BAL = P.PREV_BAL
      )
 WHERE P_ID_DATE IS NULL;

Результат

        ID_DATE   PREV_BAL   CURR_BAL
     ---------- ---------- ----------
       20200201        192        195

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...