SELECT, WHERE и единица анализа
Первый шаг — получить только необходимые столбцы и строки. Явное перечисление полей делает запрос понятнее, чем выбор всех столбцов. Условия фильтрации должны соответствовать смыслу вопроса: даты, статусы и пропуски часто требуют особого внимания. Перед агрегацией полезно проверить несколько исходных строк и убедиться, что каждая запись означает то, что вы предполагаете.
Агрегации и GROUP BY
Суммы, средние значения и количество наблюдений становятся полезными только в правильной группировке. Если считать выручку по месяцам, нужно ясно определить дату и гранулярность. COUNT строк и COUNT уникальных пользователей отвечают на разные вопросы. Ошибка в выборе меры может дать аккуратную таблицу с неверным смыслом.
JOIN и риск дублирования
Соединение таблиц требует понимания ключей. Если одной строке слева соответствует несколько строк справа, количество записей увеличится. Это нормально, если связь действительно один-ко-многим, но опасно для последующей суммы. Перед JOIN полезно проверить уникальность ключей и сравнить число строк до и после соединения.
Оконные функции
Оконные функции позволяют рассчитывать ранги, накопительные суммы и показатели относительно соседних строк, не сворачивая исходные данные. Например, можно получить предыдущую покупку пользователя или долю строки в общем результате группы. Они особенно полезны в аналитике поведения и временных рядов, где обычной группировки недостаточно.
Попробуйте на практике
Написать аналитический запрос для условной таблицы заказов.
- Определите результат: одна строка должна представлять один месяц.
- Отфильтруйте только завершённые заказы.
- Посчитайте число заказов, уникальных клиентов и сумму выручки по месяцам.
- Добавьте оконную функцию для сравнения выручки с предыдущим месяцем.
- Проверьте вручную один небольшой период исходных данных.
Как проверить результат. Запрос готов, если единица результата ясна, метрики соответствуют вопросу, а ручная проверка небольшого периода совпадает с расчётом.
Частые вопросы
Чем WHERE отличается от HAVING?
WHERE фильтрует строки до группировки, а HAVING обычно применяют к результатам агрегирования после GROUP BY.
Почему после JOIN сумма выросла?
Вероятно, одна исходная строка стала соответствовать нескольким строкам второй таблицы. Нужно проверить кардинальность связи и ключи.
Когда нужны оконные функции?
Когда нужно сохранить детализацию строк, но одновременно рассчитать ранг, накопление, предыдущие значения или показатели внутри группы.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.