У меня есть следующая таблица.

Fights (fight_year, fight_round, winner, fid, city, league)

Я пытаюсь запросить следующее:

Для каждого года, который отображается в таблице боев, найдите город, в котором проводилось больше всего боев. Например, если в 1992 году в Джерси было проведено больше боев, чем в любом другом городе, вам следует распечатать (1992, Джерси)

Вот что у меня есть до сих пор, но я продолжаю получать следующую ошибку. Я не уверен, как мне построить свою группу по функциям.

ОШИБКА: столбец ans.fight_round должен появиться в предложении GROUP BY или использоваться в агрегатной функции. Строка 3 из (выберите *

select fight_year, city, max(*)
from (select *
    from (select *
        from fights as ans
        group by (fight_year)) as l2
     group by (ans.city)) as l1;
-1
Npeach 12 Окт 2020 в 23:08

2 ответа

Лучший ответ

В Postgres я бы рекомендовал агрегирование и distinct on:

select distinct on (flight_year) flight_year, city, count(*) cnt
from flights
group by flight_year, city
order by flight_year, count(*) desc

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

Если вы хотите разрешить связи, используйте оконные функции:

select flight_year, city, cnt
from (
    select flight_year, city, count(*) cnt,
        rank() over(partition by flight_year order by count(*) desc) rn
    from flights
    group by flight_year, city
) f
where rn = 1
1
GMB 12 Окт 2020 в 20:09

Хотя row_number - самый простой способ, как это делает @GMB. Можете попробовать и эту альтернативу

select city, fight_year
from fights 
group by city, fightyear 
having count(*) = sum(case when fid is not null then 1 end)
1
GMB 12 Окт 2020 в 20:39