Как сгруппировать по подсчитанным строкам в Postgres?

#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. игнорируйте мой комментарий, он недействителен в любом допустимом случае