Można to osiągnąć za pomocą distinct on()
oraz niestandardową definicję sortowania dla benefit_type:
select distinct on (merchant_id) *
from offer
order by merchant_id,
discount desc,
case when benefit_type = 'ALL' then 1 else 2 end;
To preferuje wyższy rabat. Jeśli dwa rabaty są takie same, benefit_type to ALL
służy do rozstrzygania remisów.
Przykład online:http://rextester.com/TFBP17217