Как получить тот же результат для этого запроса SQL без использования группировки по?

0

У меня есть запрос, который выглядит следующим образом:

SELECT CO.CONTINENT, FLOOR(AVG(CI.POPULATION))
FROM CITY CI INNER JOIN COUNTRY CO
ON CI.COUNTRYCODE = CO.CODE
GROUP BY CO.CONTINENT;

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

Я пробовал следующие способы:

SELECT CO.CONTINENT, 
( SELECT FLOOR(AVG(CI2.POPULATION)) FROM CITY CI2 WHERE CI2.COUNTRYCODE = CO.CODE )
FROM CITY CI INNER JOIN COUNTRY CO
ON CI.COUNTRYCODE = CO.CODE;

или же

SELECT CO.CONTINENT, FLOOR(AVG(CI.POPULATION)) OVER(PARTITION BY CI.COUNTRYCODE)
FROM CITY CI INNER JOIN COUNTRY CO
ON CI.COUNTRYCODE = CO.CODE;
  • 0
    SELECT FLOOR(AVG(CI2.POPULATION)) ... - использование агрегатной функции GROUP BY AVG() в данном случае AVG() ) автоматически превращает запрос в запрос GROUP BY . Если запрос не содержит предложение GROUP BY , то создается неявная группа, использующая все записи, отфильтрованные WHERE .
  • 0
    @axiac Правда, но в чем твоя точка зрения?
Показать ещё 7 комментариев
Теги:

2 ответа

3

Попробуй это:

SELECT DISTINCT
    t.CONTINENT,
    (SELECT FLOOR(AVG(c2.POPULATION)) FROM COUNTRY c1 INNER JOIN CITY c2
     ON c1.CODE = c2.COUNTRYCODE WHERE c1.CONTINENT = t.CONTINENT) AS pop_avg
FROM COUNTRY t

Кстати, DISTINCT иногда реализуется под капотом, используя GROUP BY, но я не знаю, как сообщать о каждом континенте только один раз, не делая этого.

  • 0
    Тим, спасибо большое за быстрый ответ - однако, он говорит "неверный результат", я имею в виду этот вопрос: hackerrank.com/challenges/average-population-of-each-continent/…
  • 1
    @Vishal_Kotecha Попробуйте мой обновленный ответ. Кстати, в реальной жизни вы бы никогда не написали запрос таким образом. Плохой вопрос от Hacker Rank ИМХО.
Показать ещё 7 комментариев
0

Я не рекомендую этот подход, но вы можете просто сделать:

SELECT DISTINCT CO.CONTINENT, FLOOR(AVG(CI.POPULATION))
FROM CITY CI INNER JOIN
     COUNTRY CO
     ON CI.COUNTRYCODE = CO.CODE;
  • 0
    нет, это даст - не ошибка групповой функции одной группы
  • 1
    @Vishal_Kotecha Возможно, Гордон предполагал, что вы используете MySQL, а не Oracle, где этот запрос будет работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню