У меня есть запрос, который выглядит следующим образом:
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;
Попробуй это:
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
, но я не знаю, как сообщать о каждом континенте только один раз, не делая этого.
Я не рекомендую этот подход, но вы можете просто сделать:
SELECT DISTINCT CO.CONTINENT, FLOOR(AVG(CI.POPULATION))
FROM CITY CI INNER JOIN
COUNTRY CO
ON CI.COUNTRYCODE = CO.CODE;
SELECT FLOOR(AVG(CI2.POPULATION)) ...
- использование агрегатной функцииGROUP BY
AVG()
в данном случаеAVG()
) автоматически превращает запрос в запросGROUP BY
. Если запрос не содержит предложениеGROUP BY
, то создается неявная группа, использующая все записи, отфильтрованныеWHERE
.