Вы можете использовать оконную функцию:
with data (name, building) as (
values
('Bob', 'Storage'),
('Bob', 'Storage'),
('Bob', 'Storage'),
('Bob', 'Storage'),
('Fred', 'Office'),
('Tim', 'Home'),
('Tim', 'Home')
)
select distinct on (building) *,
count(*) over (partition by building) - 1 as excluded
from data
order by building;
возвращается:
name | building | excluded
-----+----------+---------
Tim | Home | 1
Fred | Office | 0
Bob | Storage | 3
Это работает, потому что оконная функция оценивается до distinct on ()
Однако это означает, что нужно выполнять какую-то работу дважды. Я думаю, что было бы быстрее повторно использовать раздел «работа», чтобы также отфильтровать дубликаты:
with ranked as (
select *,
count(*) over w - 1 as excluded,
row_number() over w as rn
from your_table
window w as (partition by building)
)
select *
from ranked
where rn = 1;