Если вы можете иметь дубликаты автомобилей для одной и той же сделки (что подразумевается вашим желанием считать разные автомобили), тогда это сложнее.Postgres не поддерживает count(distinct)
в качестве функции агрегирования.
Один из методов:
select dealer_name,
count(distinct car_id) filter (where state = 'for sale' and min_dn = max_dn) as cnt
from (select a.*,
min(a.dealer_name) over (partition by a.car_id, a.state) as min_dn,
max(a.dealer_name) over (partition by a.car_id, a.state) as max_dn
from adverts a
) a
group by dealer_name
order by dealer_name;
Или вы можете использовать два уровня агрегации:
select dealer_name,
count(*) filter (where for_sale and num_dealers = 1) as cnt
from (select dealer_name, car_id,
bool_or(state = 'for sale') as for_sale,
count(*) filter (where state = 'for sale' over (partition by car_id)) as num_dealers
from adverts
group by dealer_name, car_id
) dc
group by dealer_name;
Этитакже верните всех дилеров, даже если у них нет автомобилей для продажи.