Как посчитать числа в агрегации в sql? - PullRequest
0 голосов
/ 12 июня 2018

Итак, я хочу объединить группы точек, которые находятся в одном месте, а затем посчитать количество каждого класса, который принадлежит точке.

Мой запрос агрегации выглядит следующим образом:

create table mytable2 as
select count(*) as rows, location, string_agg(distinct class, ', ' order by class)
from mytable
group by location

Результат этого дает мне строку, например,

 (16, 'Wakanda', 'warrior priest tank')

Как мне агрегироватьпоказать вместо

(16, 'Wakanda', '10 warrior 5 priest 1 tank')

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Пример данных:

create table mytable(location text, class text);
insert into mytable values
('Wakanda', 'warrior'),
('Wakanda', 'warrior'),
('Wakanda', 'priest'),
('Wakanda', 'tank'),
('Wakanda', 'tank'),
('Wakanda', 'warrior');

Использование группировки наборов. Вы можете легко получить хороший табличный вывод:

select location, class, count(*)
from mytable
group by grouping sets ((location), (location, class));

 location |  class  | count 
----------+---------+-------
 Wakanda  | priest  |     1
 Wakanda  | tank    |     2
 Wakanda  | warrior |     3
 Wakanda  |         |     6
(4 rows)

или одну строку для местоположенияНапример:

select
    max(count) as units,
    location, 
    string_agg(class || ': ' || count, ', ') as counts
from (
    select location, class, count(*)
    from mytable
    group by grouping sets ((location), (location, class))
    ) s
group by location;

 units | location |             counts             
-------+----------+--------------------------------
     6 | Wakanda  | priest: 1, tank: 2, warrior: 3
(1 row)
0 голосов
/ 12 июня 2018

Если я правильно понимаю, вы хотите два уровня агрегации:

select lc.location,
       string_agg(class || '(' || cnt || ')', ', ' order by cnt desc)
from (select location, class, count(*) as cnt
      from mytable
      group by location, class
     ) lc
group by lc.location;

Я поместил строку в то, что я считаю более разумным форматом.Это будет выглядеть так: «Воин (10), Жрец (5), Танк (1)».Упорядочено по частоте.Вы можете (конечно) настроить синтаксис, чтобы получить другой формат, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...