SQL для Data Engineer: практика на задачах
SQL для Data Engineer нужен для загрузки, очистки, дедупликации и преобразования данных внутри пайплайнов. Важно уметь писать запросы, которые корректно работают при повторных запусках и обрабатывают только нужный диапазон данных.
Обновлено · Команда SQL Arena
Что потренируете
- инкрементальные загрузки по watermark
- дедупликация и выбор актуальной записи
- идемпотентная обработка данных
- SCD и хранение истории изменений
- ограничения и проверки качества данных
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
Есть справочник customers и поток загруженных событий customer_events. Для активных клиентов найдите последнее событие, загруженное после watermark 2026-10-19 00:00:00. Выведите id, name и время последней загрузки как last_loaded_at, начиная с самого раннего результата.
SELECT c.id, c.name, MAX(e.loaded_at) AS last_loaded_at FROM customers c JOIN customer_events e ON e.customer_id = c.id WHERE c.is_active = TRUE AND e.loaded_at > TIMESTAMP '2026-10-19 00:00:00' GROUP BY c.id, c.name ORDER BY last_loaded_at, c.id;
| # | id | name | last_loaded_at |
|---|---|---|---|
| 1 | 1 | Alice | 2026-10-19 10:20:00 |
| 2 | 2 | Bruno | 2026-10-20 07:45:00 |
| 3 | 5 | Elena | 2026-10-20 08:30:00 |
| 4 | 3 | Carla | 2026-10-20 09:00:00 |
Есть справочник customers и поток загруженных событий customer_events. Для активных клиентов найдите последнее событие, загруженное после watermark 2026-10-19 00:00:00. Выведите id, name и время последней загрузки как last_loaded_at, начиная с самого раннего результата.
SELECT c.id, c.name, MAX(e.loaded_at) AS last_loaded_at FROM customers c JOIN customer_events e ON e.customer_id = c.id WHERE c.is_active = TRUE AND e.loaded_at > TIMESTAMP '2026-10-19 00:00:00' GROUP BY c.id, c.name ORDER BY last_loaded_at, c.id;
Разбор SQL-запроса для Data Engineer
Дата-инженер часто не перечитывает весь источник при каждом запуске пайплайна. Вместо этого загрузка берёт только данные новее сохранённой границы — watermark. В примере такой границей служит 2026-10-19 00:00:00. Условие e.loaded_at > ... оставляет только события, поступившие после неё. Это не полноценный ETL-процесс, но запрос показывает его ключевой принцип.
JOIN связывает события со справочником клиентов через customer_id. Фильтр c.is_active = TRUE показывает, что инкрементальная обработка часто сочетает техническое условие загрузки с бизнес-условиями из другой таблицы. Один клиент может иметь несколько новых событий, поэтому простого фильтра недостаточно: без агрегации он попадёт в результат несколько раз.
MAX(e.loaded_at) выбирает наиболее позднюю загрузку для каждого клиента, а GROUP BY c.id, c.name формирует одну строку на сущность. Затем результат сортируется по last_loaded_at и id. Такая сортировка полезна не только для чтения результата: при обработке инкрементов однозначный порядок облегчает проверку границ и помогает увидеть, какие записи находятся ближе всего к следующему watermark.
В data engineering SQL часто используется внутри ETL- и ELT-процессов. Инкрементальная загрузка ограничивает обработку новыми или изменившимися данными, например по timestamp или другому watermark. Дедупликацию можно строить через ROW_NUMBER с разделением по бизнес-ключу и сортировкой по времени обновления, оставляя одну актуальную строку. Ещё одна важная группа задач — проверки качества: поиск NULL в обязательных полях, дублей ключей, нарушенных связей и неожиданных изменений объёма данных между этапами пайплайна.
SELECT c.id, c.name, MAX(e.loaded_at) AS last_loaded_at FROM customers c JOIN customer_events e ON e.customer_id = c.id WHERE c.is_active = TRUE AND e.loaded_at > TIMESTAMP '2026-10-19 00:00:00' GROUP BY c.id, c.name ORDER BY last_loaded_at, c.id;
| id | name | last_loaded_at |
|---|---|---|
| 1 | Alice | 2026-10-19 10:20:00 |
| 2 | Bruno | 2026-10-20 07:45:00 |
| 5 | Elena | 2026-10-20 08:30:00 |
| 3 | Carla | 2026-10-20 09:00:00 |
| 6 | Farid | 2026-10-20 09:40:00 |
Типичные ошибки Data Engineer в SQL
Нечёткая граница watermark
Условия > и >= не взаимозаменяемы. Если пайплайн сохраняет время последней обработанной записи, неверно выбранный оператор может либо повторно захватить граничную строку, либо пропустить её. Правило должно соответствовать тому, как хранится и обновляется watermark.
Дедупликация через DISTINCT без логики
DISTINCT удаляет только полностью одинаковые строки и не умеет определить, какая версия сущности является актуальной. Если у клиента несколько событий с разным временем, обычно нужна явная логика через MAX, оконную функцию или другой критерий выбора.
Инкремент, который нельзя безопасно повторить
Если повторный запуск просто добавляет те же строки ещё раз, пайплайн неидемпотентен. На практике нужно продумывать ключи, ограничения, дедупликацию или стратегию upsert, чтобы повторная обработка одного диапазона не портила целевую таблицу.
Задачи по теме в тренажёре
Трек «SQL для дата-инженера»SQL для data engineering полезно изучать через задачи, где важны не только SELECT и JOIN, но и структура таблиц, ограничения и устойчивость загрузок. В SQL Arena есть трек «SQL для дата-инженера» из 56 задач. В простых упражнениях можно потренировать связи между сущностями, создание и удаление таблиц, добавление колонок и работу со схемой. На следующем уровне появляются уникальные пары, распределения, ограничения NOT NULL и UNIQUE, внешние ключи и другие конструкции, от которых зависит качество хранилища. Отдельно доступны курсы Data Engineering и Kafka, где теория сопровождается задачами прямо в уроках. Всего в SQL Arena 1 192 задачи. У каждой задачи свои таблицы, поэтому практика ближе к реальной работе с разными источниками и моделями данных, чем к бесконечным запросам к одной учебной схеме. Решения можно выполнять в PostgreSQL, MySQL, ClickHouse и BigQuery: для каждого диалекта есть отдельная песочница в браузере. Проверка запускается на скрытых данных, поэтому запрос должен корректно обрабатывать не только строки из примера. Для разбора схем доступны ER-диаграммы, а EXPLAIN помогает посмотреть план выполнения. AI-ментор может давать подсказки и объяснять ошибки; бесплатно доступно 10 обращений. Для проверки навыка без помощи есть режим «Собеседование» с серверным таймером, отключёнными подсказками и отчётом после сессии; бесплатно доступен один запуск в день. Всего на платформе 12 профессиональных треков и 10 курсов. Бесплатный тариф не требует карты и открывает 292 задачи для всех четырёх поддерживаемых диалектов.
- EasyбесплатноЗаказы конкретного клиента через связьpostgresql
- EasyбесплатноСоздать таблицу projectspostgresqlmysql
- EasyбесплатноУдалить таблицу departmentspostgresqlmysql
- EasyбесплатноДобавить email сотрудникаpostgresqlmysql
- MediumPremiumУникальные пары переводовpostgresqlmysqlclickhouse
- MediumPremiumРаспределение пользователей по количеству твитов в 2022 годуpostgresqlmysqlclickhouse
- MediumPremiumТаблица customers с обязательными данными и уникальным emailpostgresqlmysql
- MediumPremiumВнешний ключ от сотрудников к отделамpostgresqlmysql
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Какой SQL нужен Data Engineer?
Data Engineer должен уверенно владеть JOIN, агрегациями, CTE, оконными функциями и операциями преобразования данных. Особенно важны запросы для инкрементальных загрузок, дедупликации, контроля качества и подготовки данных к следующим этапам пайплайна.
Как SQL используется в Data Engineering?
SQL применяется для извлечения, очистки, преобразования и загрузки данных между слоями хранилища. Через него также выполняют дедупликацию, проверки качества, построение промежуточных таблиц и расчёт производных полей.
Что такое инкрементальная загрузка в SQL?
При инкрементальной загрузке обрабатываются только новые или изменившиеся строки после некоторой границы. Такой границей может быть timestamp, последовательный идентификатор или другой watermark, который сохраняется между запусками.
Как удалить дубли в SQL для Data Engineering?
Один из распространённых способов — присвоить строкам ROW_NUMBER внутри каждого бизнес-ключа и отсортировать их по времени обновления. Затем оставляют строку с номером 1, соответствующую выбранному правилу приоритета.
Практика SQL для Data Engineer на задачах
Продолжите в треке «SQL для дата-инженера» из 56 задач: от таблиц, связей и ограничений до запросов, связанных с подготовкой и проверкой данных. Для более системного изучения также доступны курсы Data Engineering и Kafka.
Открыть трек для дата-инженера