Таким образом, вы должны различать, что END_DTM сначала является нулевым, а не ненулевым, и только затем следует рассмотреть либо END_DTM, либо START_DTM для дальнейшего упорядочения.
Функция NVL2 - это именно то, что вам нужно для первой части. Требуется три аргумента;он возвращает второй аргумент, когда первый не равен нулю, и третий аргумент, когда он равен нулю. Итак: NVL2 (END_DTM, 1, 0) вернет 1, если дата не равна нулю, и 0, если она равна нулю. И затем, вы можете снова использовать NVL2, чтобы выбрать END_DTM, когда он не нулевой, а START_DTM, когда он нулевой.
Затем вы можете использовать это при определении ROW_NUMBER (), в предложении ORDER BY, например, так:
select [whatever]
from
( select t.*,
row_number() over (order by nvl2(END_DTM, 1, 0),
nvl2(END_DTM, END_DTM, START_DTM) desc) rn
from your_table t
)
where rn = 1
;
Если END_DTM всегда не равен нулю (или если он всегда равен нулю), то первое значение NVL2 является постоянным, поэтому упорядочение выполняется только по END_DTM (если END_DTM всегда не равно нулю),соответственноSTART_DTM (если END_DTM всегда равен нулю). Но если есть сочетание нулевого и ненулевого END_DTM, то только критерии с нулевым END_DTM связываются по первому критерию упорядочения, и затем для выбора максимального значения START_DTM рассматриваются только эти строки.