Как определить категорию с наибольшим количеством участников в группе? - PullRequest
0 голосов
/ 28 мая 2020
select substr(shopabb, 1, 4) as shopgroup, count(*)
from table
where shopabb like'h%'
group by substr(shoppabb, 1, 4)
order by count(*) DESC;

Я считаю все аббревиатуры магазинов из моей таблицы в группах подстрок. У меня есть еще один столбец под названием «город», который показывает, где расположены сокращения магазинов. Теперь я также хочу выбрать / показать город, в котором чаще всего встречается группа подстрок, и, если возможно, также количество шопабб в этом городе. Результат должен выглядеть так:

    shopabb   Count(*)   City      Count_City
    -----------------------------------------
   hel         50         London    40
   heal        20         Berlin    15   
   hot         10         Rome       8

Спасибо!

1 Ответ

2 голосов
/ 28 мая 2020

Используйте row_number() с двумя уровнями агрегации:

select shopgroup, sum(cnt) as total_count, 
       max(case when seqnum = 1 then city end) as city_with_max,
       max(case when seqnum = 1 then cnt end) as cnt_at_max
from (select substr(shopabb, 1, 4) as shopgroup, city, count(*) as cnt,
             row_number() over (partition by substr(shopabb, 1, 4) order by count(*) desc) as seqnum
      from table
      where shopabb like'h%'
      group by substr(shopabb, 1, 4), city
     ) t
group by shopgroup
order by sum(cnt) DESC;

Здесь - скрипт db <>, иллюстрирующий, что синтаксис работает.

EDIT:

Вы можете сделать это без оконных функций, но это намного более громоздко:

select substr(shopabb, 1, 4) as shopgroup, city, count(*) as cnt
from table t
where shopabb like'h%'
group by substr(shoppabb, 1, 4), city
having count(*) = (select count(*)
                   from table t2
                   where substr(t2.shopabb, 1, 4) = substr(t.shopabb, 1, 4)
                   group by city
                   order by count(*) desc
                   limit 1
                  );

Обратите внимание, что это вернет дубликаты, если два города совпадают по макс. Также потребуется немного больше работы, чтобы получить общую сумму.

...