feat(dm): завершено построение DM-слоя (5 витрин) и исправлены баги денормализации
- Зачем: - предоставить студентам полный набор аналитических витрин с примерами различных паттернов (UPSERT, Full Rebuild, UNION ALL, двухуровневая агрегация). - Что: - реализованы витрины: sales_report, route_performance, passenger_loyalty, airport_traffic, monthly_overview. - исправлен баг в route_performance_load.sql: добавлены JOIN к dim_airports и dim_airplanes для корректной денормализации атрибутов. - обновлен скрипт e2e_etl.sh: добавлена верификация всех 5 витрин и проверка бизнес-логики (load factor). - обновлены DAGи, тесты и главный DDL скрипт. - Проверка: - автоматизированный прогон e2e_etl.sh через REST API Airflow.
This commit is contained in:
@@ -29,7 +29,7 @@ JOIN dds.dim_routes r ON f.route_sk = r.route_sk
|
||||
JOIN dds.dim_calendar cal ON f.calendar_sk = cal.calendar_sk
|
||||
GROUP BY r.route_bk;
|
||||
|
||||
-- Шаг 3: Объединяем агрегаты с АКТУАЛЬНЫМИ атрибутами маршрута.
|
||||
-- Шаг 3: Объединяем агрегаты с АКТУАЛЬНЫМИ атрибутами маршрута, аэропортов и самолетов.
|
||||
INSERT INTO dm.route_performance (
|
||||
route_bk,
|
||||
route_sk,
|
||||
@@ -54,13 +54,13 @@ INSERT INTO dm.route_performance (
|
||||
SELECT
|
||||
m.route_bk,
|
||||
r_curr.route_sk,
|
||||
r_curr.departure_airport_bk,
|
||||
r_curr.departure_city,
|
||||
r_curr.arrival_airport_bk,
|
||||
r_curr.arrival_city,
|
||||
r_curr.airplane_bk,
|
||||
r_curr.airplane_model,
|
||||
r_curr.total_seats,
|
||||
dep.airport_bk AS departure_airport_bk,
|
||||
dep.city AS departure_city,
|
||||
arr.airport_bk AS arrival_airport_bk,
|
||||
arr.city AS arrival_city,
|
||||
air.airplane_bk,
|
||||
air.model AS airplane_model,
|
||||
air.total_seats,
|
||||
m.total_flights,
|
||||
m.total_tickets,
|
||||
m.total_boarded,
|
||||
@@ -69,14 +69,15 @@ SELECT
|
||||
(m.total_revenue / NULLIF(m.total_tickets, 0))::NUMERIC(10,2),
|
||||
m.avg_boarding_rate::NUMERIC(5,4),
|
||||
-- Load Factor: общее кол-во посадок / (кол-во рейсов * мест в самолете)
|
||||
-- Это учебное допущение (упрощение), т.к. самолет мог меняться.
|
||||
ROUND(
|
||||
m.total_boarded::NUMERIC / NULLIF(m.total_flights * r_curr.total_seats, 0),
|
||||
m.total_boarded::NUMERIC / NULLIF(m.total_flights * air.total_seats, 0),
|
||||
4
|
||||
) AS avg_load_factor,
|
||||
m.first_flight_date,
|
||||
m.last_flight_date,
|
||||
'{{ run_id }}' AS _load_id
|
||||
FROM tmp_route_metrics m
|
||||
JOIN dds.dim_routes r_curr ON m.route_bk = r_curr.route_bk
|
||||
WHERE r_curr.valid_to IS NULL; -- Берем только АКТУАЛЬНУЮ версию для денормализации
|
||||
JOIN dds.dim_routes r_curr ON m.route_bk = r_curr.route_bk AND r_curr.valid_to IS NULL
|
||||
JOIN dds.dim_airports dep ON r_curr.departure_airport = dep.airport_bk
|
||||
JOIN dds.dim_airports arr ON r_curr.arrival_airport = arr.airport_bk
|
||||
JOIN dds.dim_airplanes air ON r_curr.airplane_code = air.airplane_bk;
|
||||
|
||||
Reference in New Issue
Block a user