greatest-n-per-group les questions sont généralement résolues à l'aide des fonctions de fenêtre :
select *
from (
select book_id, author_id, mark, year,
row_number() over (partition by author_id order by case mark when 'GREAT' then 1 when 'MEDIUM' then 2 else 3 end) as rn
from books
) t
where rn = 1;
Ce qui précède est le SQL ANSI standard, mais dans Postgres en utilisant le distinct on
(propriétaire) est généralement beaucoup plus rapide :
select distinct on (author_id) book_id, author_id, mark, year,
from books
order by author_id,
case mark when 'GREAT' then 1 when 'MEDIUM' then 2 else 3 end