Menu
Coddy logo textTech

Группировка. Часть 2

Часть раздела Основы путешествия по SQL на Coddy — урок 37 из 72.

Ключевое слово WHERE применяет условие к каждой записи отдельно. Например:

SELECT * FROM table1
WHERE col1 > col2

col1 > col2 будет применено к каждой записи и проверено, выполняется ли оно.

Но что, если мы хотим отфильтровать агрегированные результаты? Например:

SELECT category, AVG(price) FROM table1
WHERE AVG(price) > 40
GROUP BY category

Это не сработает, потому что WHERE не может проверять агрегации. Для этого у нас есть ключевое слово HAVING. Оно фильтрует данные по условию агрегации.

SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40

Это отфильтрует все категории, для которых средняя цена больше 40.

Если мы хотим объединить HAVING и клаузу WHERE, мы напишем:

SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40

Это сначала пройдётся по записям одну за другой и отфильтрует все записи, для которых цена больше 25, а только после этого выполнит клаузу GROUP BY и отфильтрует каждую категорию, для которой средняя цена больше 40.

challenge icon

Задание

Средне

Доступные таблицы и столбцы:

  • <strong>earthquakes</strong>: <strong>location</strong>, <strong>amplitude</strong>, <strong>period</strong>

Шкала Рихтера — это логарифмическая шкала, используемая для измерения магнитуды землетрясений.

Нам нужно вернуть среднюю магнитуду для каждого местоположения всех крупных землетрясений

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

  • Амплитуда больше или равна 1
  • Период волн больше или равен 1 минуте

Для этого вызова мы будем использовать другую формулу: M = (A/T)<sup>2</sup> / T, которая эквивалентна M = ((A/T)*(A/T)) / T.

Верните местоположение и среднюю магнитуду для каждого местоположения, включая только крупные землетрясения (назовите столбец avg_magnitude). Включите в результат только местоположения, где avg_magnitude больше 1

Округлите результаты до 2 знаков после запятой

Шпаргалка

Ключевое слово WHERE фильтрует отдельные записи, в то время как HAVING фильтрует агрегированные результаты после группировки:

SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40

Чтобы комбинировать оба предложения:

SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40

WHERE сначала фильтрует записи, затем GROUP BY группирует оставшиеся данные, и наконец HAVING фильтрует сгруппированные результаты.

Попробуйте сами

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы