Esto se puede lograr usando distinct on()
y una definición de clasificación personalizada para el tipo_beneficio:
select distinct on (merchant_id) *
from offer
order by merchant_id,
discount desc,
case when benefit_type = 'ALL' then 1 else 2 end;
Esto prefiere mayor descuento. Si dos descuentos son iguales, un tipo_beneficio de ALL
se utiliza como criterio de desempate.
Ejemplo en línea:http://rextester.com/TFBP17217