Вы можете попробовать использовать row_number()
:
select dj.*
from (select dj.*,
row_number() over (partition by centerid, studentid
order by (status <> 'D') desc,
(case when status <> 'D' then id end) desc,
id asc
) as seqnum
from dailyjournals dj
) dj
where seqnum = 1;
РЕДАКТИРОВАТЬ:
С точки зрения производительности, вероятно, лучшее, что вы можете сделать, - это вычисляемый столбец с индексом.
alter table DailyJournals
add column magic_d_id int as
(status = 'D' then id else - id end);
create index dailyjournals_magic_d_id on DailyJournals(centerid, dataid, magic_d_id);
Вы можете попробовать row_number()
:
row_number() over (partition by centerid, studentid order by magic_d_id)
Я не уверен, что это будет использовать индекс. Вы также можете использовать:
select dj.*
from dailyjournals dj
where dj.magic_d_id = (select dj2.magic_d_id
from dailyjournals dj2
where dj2.centerid = dj.centerid and
dj2.studentid = dj.studentid and
order by dj2.magic_d_id
limit 1
);
Предполагается, что id
является целым числом и никогда не бывает отрицательным.