🦕Естественно, самый очевидный и оптимальный вариант использовать подзапрос:
SELECT
occurrences,
COUNT(1) AS num_inn
FROM (
SELECT COUNT(1) AS occurrences
FROM test
GROUP BY inn
)
GROUP BY occurrences
ORDER BY num_inn DESC, occurrences;
Я обычно пишу count(1) вместо count(*), чтобы на всякий база не пошла читать все столбцы. Но многие говорят, что это миф и они абсолютно одинаковы, так что решать вам🪙
Также в подзапросе можно группировать по столбцу, но не включать его в селект.
🍊 Второй вариант я никогда не применяла, но мы можем подать в оконку результат из group by. Это следует из порядка исполнения запроса:
from -> join -> where -> group by -> having -> select (вместе с оконками) -> order by -> limit
То есть на этапе селекта мы уже сделали все группировки и можем спокойно использовать:
SELECT DISTINCT
COUNT(inn) AS occurrences,
COUNT(COUNT(inn)) OVER (PARTITION BY COUNT(inn)) AS num_inn
FROM test
GROUP BY inn
ORDER BY num_inn DESC, occurrences;
📝Последняя строчка в плане для обоих запросов:
Sort(cost=43.09..43.59)
Unique(cost=52.31..53.81)
Второй запрос тяжелее, но вам может встретиться кейс, когда первый вариант не подойдет, так что имейте в виду😎