# Учебные задания ## О чём задание В стенде уже работает **эталонный вертикальный срез** — полная цепочка `STG → ODS → DDS → DM` для витрины `dm.sales_report`. Ваша задача — реализовать недостающие загрузки по аналогии с эталоном. На месте ваших заданий сейчас стоят **заглушки** (`SELECT 1;`). Вы замените их на реальную SQL-логику, и после этого весь DWH будет заполнен. ## Перед началом Убедитесь, что стенд запущен и данные загружены — пройдите шаги 1–6 из [README (Быстрый старт)](../../README.md#быстрый-старт-основной-сценарий-bookings--stg--ods--dds--dm). После этого в Greenplum будут данные в эталонных таблицах (`stg.*`, `ods.bookings`, `dds.dim_airports`, `dds.fact_flight_sales`, `dm.sales_report` и др.). ## Шаг 1. Изучите эталон Прежде чем писать код, разберите, как устроены эталонные загрузки. По одному файлу на каждый ключевой паттерн: | Паттерн | Файл для изучения | Что посмотреть | |---------|-------------------|----------------| | ODS: TRUNCATE + INSERT (snapshot-справочник) | `sql/ods/airports_load.sql` | Фильтрация по `stg_batch_id`, дедупликация через `ROW_NUMBER()` | | DDS: SCD1 UPSERT (измерение) | `sql/dds/dim_airports_load.sql` | TEMP TABLE → UPDATE (`IS DISTINCT FROM`) → INSERT | | DM: витрина с UPSERT | `sql/dm/sales_report_load.sql` | HWM-инкремент, агрегация фактов по измерениям | Описания каждого DAG — в `docs/`: [STG](../bookings_to_gp_stage.md) · [ODS](../bookings_to_gp_ods.md) · [DDS](../bookings_to_gp_dds.md) · [DM](../bookings_to_gp_dm.md) ## Шаг 2. Откройте ТЗ Техническое задание от аналитика: **[analyst_spec.md](analyst_spec.md)**. Там описаны все таблицы, которые нужно реализовать, с маппингами, бизнес-правилами и подсказками. Рекомендуемый порядок (от простого к сложному): 1. ODS: `airplanes`, `seats` 2. DDS: `dim_airplanes`, `dim_passengers` (SCD1) 3. DDS: `dim_routes` (SCD2 — ключевой вызов курсовой) 4. DM: `airport_traffic`, `route_performance`, `monthly_overview`, `passenger_loyalty` ## Шаг 3. Реализуйте задания - **Файлы-заглушки уже на месте** — например, `sql/ods/airplanes_load.sql` содержит `SELECT 1;`. Ваша задача: заменить `SELECT 1;` на реальную SQL-логику. - **DDL уже создан** — таблицы существуют, создавать их не нужно. - **Таски в DAG-ах уже подключены** — `PostgresOperator` ссылается на ваши SQL-файлы. Менять Python-код DAG-ов не нужно. - **Нейминг полей:** сверяйтесь с `docs/design/naming_conventions.md`. ## Шаг 4. Проверьте себя валидационным DAG-ом DAG **`bookings_validate`** — автоматическая проверка вашей реализации. - Три группы проверок: `validate_ods`, `validate_dds`, `validate_dm` — запускаются параллельно. Можно проверять ODS, пока DDS ещё не готов. - Включает активный SCD2-тест для `dim_routes`: загружает изменённые данные и проверяет, что версионирование работает корректно. - Сообщения об ошибках подскажут, что именно не так и что делать дальше. **Цель: все проверки зелёные.** ## Если застряли - Изучите эталонные SQL-скрипты — в них те же паттерны, что нужны для заданий. - Загляните в `docs/design/naming_conventions.md` — единый источник нейминга полей. - Сверьтесь с **веткой `solution`** — там полная рабочая реализация. ## Для менторов Дизайн заданий и педагогическая логика — в ветке `solution` (`docs/design/assignment_design.md`).