Если я вас правильно, вы пытаетесь получить запись на ID или с самой высокой датой (случайной один, если несколько записей с одинаковой датой существует) или с датой NULL (опять случайные один, когда более NULL записи с тем же идентификатором не существует.
Так предполагая эти данные
ID EDIT_DATE TEXT
---------- ------------------- ----
1 01.01.2015 00:00:00 A
1 01.01.2016 00:00:00 B
1 01.01.2016 00:00:00 C
2 01.01.2015 00:00:00 D
2 01.01.2016 00:00:00 E
2 F
2 G
Вы ожидаете либо B или C для ID = 1 и либо F или G для ID = 2.
Этот запрос сделать Это. Функция используется упорядоченности с NULLS ПЕРВЫХ и добавляющей случайное значение в качестве последнего заказа столбца - получить случайный результат, если все столбцы, предшествующие же ..
with dta as (
select 1 id, to_date('01012015','ddmmyyyy') edit_date, 'A' text from dual union all
select 1 id, to_date('01012016','ddmmyyyy') edit_date, 'B' text from dual union all
select 1 id, to_date('01012016','ddmmyyyy') edit_date, 'C' text from dual union all
select 2 id, to_date('01012015','ddmmyyyy') edit_date, 'D' text from dual union all
select 2 id, to_date('01012016','ddmmyyyy') edit_date, 'E' text from dual union all
select 2 id, NULL edit_date, 'F' text from dual union all
select 2 id, NULL edit_date, 'G' text from dual),
dta2 as (
select ID, EDIT_DATE, TEXT,
row_number() over (partition by ID order by edit_date DESC NULLS first, DBMS_RANDOM.VALUE) as rn
from dta)
select *
from dta2 where rn = 1
order by id
;
ID EDIT_DATE TEXT RN
---------- ------------------- ---- ----------
1 01.01.2016 00:00:00 B 1
2 F 1
Надеется, вы можете повторно использовать идея, если вам нужен немного другой результат ...
Выражение case возвращает одно значение. Он не используется для условного выполнения кода. – jarlh
@jarlh - Я не вижу «условного исполнения» в любом месте, я просто вижу выражение 'case', используемое в предложении' order by'. Это допустимое использование. – mathguy
@mathguy, \t Кажется, что OP хочет сортировать по DBMS_RANDOM.VALUE (когда c.edit_date = 'null'), или по DBMS_RANDOM.VALUE, c.edit_date desc. То есть либо одной, либо другой. Какое-то условное исполнение. – jarlh