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

Мой иерархический запрос выглядит так:

select ID, PARENT_ID, START_TIME
FROM PROCESS
START WITH ID='X'
CONNECT BY ID=PRIOR PARENT_ID

Моя проблема в том, что есть строки с одинаковым идентификатором «X», и я хочу, чтобы возвращался только самый последний (когда процесс дублируется, его идентификатор тот же - не могу это изменить). Кроме того, я хочу, чтобы он подключался только по предыдущему родительскому идентификатору для самой последней строки.

Из документов видно, что я не могу выполнить запрос в соединении, чтобы получить только последний предыдущий parent_id - нужно ли мне фильтровать в коде или есть ли способ сделать это в запросе?


person Mike    schedule 03.05.2018    source источник
comment
Отредактируйте свой вопрос и покажите образцы данных и ожидаемые результаты. Только текстовые данные, без изображений.   -  person Kaushik Nayak    schedule 04.05.2018


Ответы (1)


Используйте аналитическую функцию ROW_NUMBER(), чтобы получить последнюю строку для каждого ID:

SELECT ID,
       PARENT_ID,
       START_TIME
FROM   (
  SELECT p.*,
         ROW_NUMBER() OVER (
           PARTITION BY id
           ORDER BY start_time DESC
         ) AS rn
  FROM   process p
)
WHERE rn = 1
START WITH ID = 'X'
CONNECT BY ID = PRIOR PARENT_ID;
person MT0    schedule 03.05.2018
comment
Спасибо МТ0. Это лучше, но он получает только первый уровень последнего процесса. Если A является родителем B, а B является родителем C, и B был дублирован, эти дубликаты отображаются. Дубликаты C не являются. Кажется, что соединение по ID = PRIOR PARENT_ID всегда будет соответствовать большему количеству строк, когда они существуют? - person Mike; 04.05.2018