#postgresql
#postgresql
Вопрос:
Если у меня есть столик:
id | status
---- --------
2 | 200
1 | 0
4 | 100
3 | 200
5 | 200
Я хочу подсчитать количество вхождений каждого статуса. Я пытался использовать функцию COUNT / OVER
SELECT status, COUNT(*) OVER () AS all, COUNT(*) OVER (PARTITION by status) as count FROM my_table;
Результаты соответствуют ожидаемым в соответствии с документами postgres в Windows «Однако оконные функции не приводят к группированию строк в одну выходную строку, как это было бы при неоконных агрегированных вызовах. Вместо этого строки сохраняют свои отдельные идентификаторы».
status | all | count
-------- ------- -------
0 | 5 | 1
100 | 5 | 1
200 | 5 | 3
200 | 5 | 3
200 | 5 | 3
Как вместо этого можно получить вывод, который объединяет строки, так что я получаю только 1 строку для каждого уникального статуса, если требуется раздел?
status | all | count
-------- ------- -------
0 | 5 | 1
100 | 5 | 1
200 | 5 | 3
Комментарии:
1. Снова сгруппируйте и выберите первую строку с помощью row_number() .
2. @wildplasser Я довольно новичок в Postgres, можете ли вы привести пример использования?
3. Поскольку вы, похоже, расширяете вопрос, я не буду отвечать.
Ответ №1:
На первом этапе запроса нет необходимости в оконной функции, т.е. получении количества для каждого статуса. Оконные функции работают с результатом неоконной части запроса, таким образом, у вас может быть оконная функция, ссылающаяся на агрегированные и неагрегированные столбцы в запросе. Чтобы получить all_counts
, достаточно SUM
status_count
перебрать все строки.
SELECT
status
, COUNT(*) status_count
, SUM(COUNT(*)) OVER () all_count
FROM my_table
GROUP BY status
Комментарии:
1. Doh, мои извинения, я должен был указать, что требуется оконная функция. Я выбрал тривиальный случай для раздела, но допустим, это что-то другое, например, РАЗДЕЛ ПО статусу> 100.
2. Я добавил второй раздел, чтобы, надеюсь, сделать требования к разделам более четкими
3. <s> Я все еще не могу заставить раздел работать, как в моем примере выше, РАЗДЕЛ ПО статусу> 100. OVER () работает, но OVER (РАЗДЕЛЕНИЕ ПО статусу> 100) не работает </s>
4. игнорируйте мой комментарий, он недействителен в любом допустимом случае