Proanalytics.tech
ГайдыSQL задачи на собеседовании: типы, логика решения и типичные ошибки

SQL задачи на собеседовании: типы, логика решения и типичные ошибки

11 мин чтения · 9 разделов

На собеседовании по SQL проверяют не память, а умение разложить вопрос на шаги и выбрать подходящий инструмент.

Разминка: SELECT, WHERE, ORDER BY, LIMIT

Разминка показывает, свободно ли вы пишете базовый запрос. Порядок работы такой: FROM и WHERE отбирают строки, GROUP BY с HAVING собирают группы, SELECT считает выражения, и лишь в конце работают ORDER BY и LIMIT.

Поэтому сортировка идёт до LIMIT: LIMIT обрезает уже упорядоченный результат. Без ORDER BY порядок строк не гарантирован, так что проговорите допущение: «топ считаю по убыванию выручки, равенства развожу по id».

Агрегация и группировка: где чаще всего спотыкаются

COUNT(*) считает строки, а COUNT(колонка) — только те, где значение не NULL. Разница видна после LEFT JOIN: COUNT(o.id) покажет ноль заказов у клиента, а COUNT(*) вернёт единицу, ведь строка клиента осталась.

SUM и AVG пропускают NULL, поэтому AVG(x) делит сумму на число непустых значений — частая причина неверного среднего чека. WHERE фильтрует строки до группировки, HAVING — уже собранные группы, и перепутать их легко.

Соединения: INNER, LEFT и тихая потеря строк

INNER JOIN оставляет только совпадения, LEFT JOIN сохраняет все строки левой таблицы и подставляет NULL справа. Если справа несколько совпадений, LEFT JOIN размножит строки и завысит суммы — самая дорогая ошибка в задачах на метрики.

Условие на правую таблицу в WHERE превращает LEFT JOIN в INNER: чтобы сохранить строки без пары, пишите условие в ON. Соединение по нескольким ключам нужно там, где уникальна только их пара.

Подзапросы и CTE: разбить задачу на шаги

Подзапрос читаемее соединения, когда на строку нужна одна метрика или фильтр по агрегату: WHERE amount > (SELECT AVG(amount) FROM payments). Коррелированный подзапрос выполняется для каждой строки внешнего запроса и часто проигрывает соединению или оконной функции.

WITH позволяет назвать промежуточные шаги: сначала активность по дням, потом сглаживание, потом метрика. Так проще и писать, и объяснять ход решения.

Оконные функции: ранжирование, итоги, сравнение периодов

ROW_NUMBER даёт уникальные номера, RANK повторяет номер при равенстве и пропускает следующие, DENSE_RANK повторяет без пропусков. «По одному заказу на клиента» — это ROW_NUMBER, «все, кто попал в топ-3» — DENSE_RANK.

PARTITION BY делит строки на группы, ORDER BY задаёт порядок внутри группы. Окно считается после WHERE и GROUP BY, поэтому фильтровать по его результату прямо в WHERE нельзя — нужен отдельный шаг в CTE.

Даты, когорты и воронки: метрики, которые спрашивают чаще всего

Активность по дням считается через усечение даты до дня и COUNT(DISTINCT user_id), при этом помните про часовой пояс: граница дня зависит от зоны расчёта.

Удержание строится от когорты — даты первого действия, дальше считается номер дня жизни и собирается матрица «когорта × день». В воронке важен один и тот же знаменатель на всех шагах, а пропущенные даты лечатся соединением с календарём.

Оптимизация: план, индексы и лишние строки

Начните с плана: EXPLAIN показывает, как база собирается читать таблицы, EXPLAIN ANALYZE добавляет факт выполнения. Сравните оценку строк с реальной — большое расхождение говорит об устаревшей статистике.

Индекс работает, когда условие применяется к колонке напрямую. Запись date_trunc('day', created_at) = ... или created_at::date = ... обычно лишает индекс смысла: перепишите её в диапазон created_at >= '2025-01-01' AND created_at < '2025-01-02'.

Как вести себя на собеседовании, пока решаете задачу

Уточняющие вопросы экономят половину времени: какие таблицы и ключи, что считается дублем, нужен уникальный пользователь или все события, какой период брать, как трактовать NULL.

Проговаривайте допущения: «оплатой считаю только status = 'paid'», «один user_id — один человек», и проверяйте логику руками на трёх-четырёх строках. Если решение не идёт, назовите, что именно неизвестно, предложите вариант «в лоб» и улучшайте его: молчание хуже простого ответа.

Типичные ошибки, которые мешают дойти до оффера

NULL в сравнениях: col = NULL никогда не истинно, нужны IS NULL и IS NOT NULL, а NOT IN с NULL внутри подзапроса вернёт пустой результат. Неявное приведение типов даёт странные совпадения и убивает индекс.

Дальше по списку: COUNT по неверной колонке, потеря строк в соединении и неверный знаменатель метрики. Последнее встречается чаще всего: средний чек считают по строкам позиций, хотя делить нужно на число заказов.

Что сделать: короткий чеклист

Где тренировать

Темы из гайда разобраны в тестах портала — каждый вопрос с объяснением ответа:

Возьмите одну тему и решите пять задач подряд: разминку на SELECT, затем агрегацию, соединения и оконные функции. На Proanalytics.tech курс SQL собран из 159 вопросов и 13 тем, вводная тема открыта бесплатно и без регистрации, а диагностика из 20 вопросов покажет, с чего начать. Дальше — практика: каждый разобранный запрос делает ваш ответ на собеседовании спокойнее.

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

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

Создать аккаунт — вводная тема бесплатна Пройти демо-тест без регистрации

Частые вопросы

Сколько задач по SQL дают на собеседовании?
Обычно одну-две задачи и несколько вопросов по теории: агрегация, соединения, оконные функции. Всё зависит от команды и уровня позиции.
Что просят написать чаще всего?
Топ-N по метрике, последний заказ каждого пользователя, удержание по когортам, воронку шагов и поиск дублей.
Можно ли решить задачу без оконных функций?
Да, но запрос выйдет длиннее: последний заказ придётся искать соединением с максимумом по дате. Оконные функции читаются проще.
Как понять, что запрос написан верно?
Проверьте его на строках, где ответ известен заранее, и посмотрите план. Отдельно убедитесь, что фильтры не срезают нужные строки.
Помогает ли тренажёр подготовиться к собеседованию?
На Proanalytics.tech собрано 1 443 вопроса с объяснением каждого ответа, 113 тем и 12 курсов, включая SQL из 159 вопросов и 13 тем. Это тренировка, а не сертификация: гарантий трудоустройства нет.

Другие гайды

Как подготовиться к собеседованию аналитика: план по шагам и срокам Что делать, если не знаешь ответ на собеседовании С чего начать в аналитике: направления, порядок обучения и план первых недель Вопросы на собеседовании системного аналитика: блоки, примеры и логика ответа Вопросы на собеседовании бизнес-аналитика: блоки, примеры и логика ответов Вопросы на собеседовании продуктового аналитика: блоки, примеры и логика ответов Вопросы на собеседовании аналитика данных: блоки и задачи Собеседование джуна аналитика: чего ждут и как отвечать Собеседование на Мидл-аналитика: блоки вопросов, логика ответов и кейсы Собеседование на Сеньор аналитика: что проверяют и как отвечать Как посчитать A/B-тест: выборка, длительность и чтение результата Кейсы на собеседовании аналитика: как разбирать и отвечать по шагам Кейсы системного аналитика: 8 рабочих ситуаций с логикой решения Как читать чужой SQL запрос: пошаговый разбор Ошибки в отчётах: как найти расхождение и перестать терять доверие к цифрам Первая неделя работы аналитика: спокойный план действий Как подготовиться к тестовому заданию аналитика Метрики продукта: с чего начать Как вести документацию аналитика Собеседование без опыта: план на месяц
Все гайды Курсы и тесты