- Зачем: - необходимо продемонстрировать студентам работу с одной сущностью в разных ролях (вылет/прилет) через UNION ALL. - Что: - созданы DDL, Load и DQ скрипты для витрины dm.airport_traffic (пассажиропоток аэропортов). - реализован паттерн Unpivot через UNION ALL для консолидации метрик вылета и прилета в одном разрезе. - внедрена инкрементальная загрузка по затронутым датам (HWM) с честным подсчетом рейсов через COUNT(DISTINCT). - добавлены подробные комментарии к колонкам выручки, предупреждающие о риске двойного счета. - обновлены DAGи bookings_dm_ddl и bookings_to_gp_dm для включения витрины в общий пайплайн. - Проверка: - визуальный аудит SQL-кода на предмет использования airport_bk и корректной агрегации по ролям. - наличие DQ-инварианта total_passengers = departures + arrivals. - верификация блока UPDATE: теперь обновляются и денормализованные атрибуты (city, airport_bk).
50 lines
2.2 KiB
SQL
50 lines
2.2 KiB
SQL
-- DQ проверки для витрины dm.airport_traffic.
|
||
--
|
||
-- Учебные цели:
|
||
-- 1. Проверка арифметических инвариантов (сумма частей должна быть равна целому).
|
||
-- 2. Валидация уникальности составного ключа (зерна).
|
||
|
||
DO $$
|
||
DECLARE
|
||
row_count INTEGER;
|
||
duplicate_count INTEGER;
|
||
invalid_total_count INTEGER;
|
||
negative_metrics_count INTEGER;
|
||
BEGIN
|
||
-- 1. Проверка на наполненность
|
||
SELECT COUNT(*) INTO row_count FROM dm.airport_traffic;
|
||
IF row_count = 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: Таблица dm.airport_traffic пуста.';
|
||
END IF;
|
||
|
||
-- 2. Проверка на уникальность (зерно - traffic_date + airport_sk)
|
||
SELECT COUNT(*) INTO duplicate_count
|
||
FROM (
|
||
SELECT traffic_date, airport_sk FROM dm.airport_traffic
|
||
GROUP BY traffic_date, airport_sk HAVING COUNT(*) > 1
|
||
) q;
|
||
IF duplicate_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.airport_traffic обнаружены дубликаты по (date, airport_sk) (% шт).', duplicate_count;
|
||
END IF;
|
||
|
||
-- 3. Проверка инварианта total = departures + arrivals
|
||
SELECT COUNT(*) INTO invalid_total_count
|
||
FROM dm.airport_traffic
|
||
WHERE total_passengers != (departures_passengers + arrivals_passengers);
|
||
|
||
IF invalid_total_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.airport_traffic нарушен инвариант total_passengers = dep + arr (% строк).', invalid_total_count;
|
||
END IF;
|
||
|
||
-- 4. Проверка на отрицательные значения
|
||
SELECT COUNT(*) INTO negative_metrics_count
|
||
FROM dm.airport_traffic
|
||
WHERE departures_flights < 0 OR arrivals_flights < 0 OR departures_revenue < 0 OR arrivals_revenue < 0;
|
||
|
||
IF negative_metrics_count > 0 THEN
|
||
RAISE EXCEPTION 'DQ Error: В dm.airport_traffic обнаружены отрицательные метрики (% строк).', negative_metrics_count;
|
||
END IF;
|
||
|
||
RAISE NOTICE 'DQ Success: dm.airport_traffic успешно прошла все проверки (% строк).', row_count;
|
||
END $$;
|