Files
airflow-greenplum/sql/dm/route_performance_dq.sql
T
ddadmin 491f1e68d6 feat(dm): добавлена витрина route_performance и обновлены DM DAGи
- Зачем:
  - необходимо продемонстрировать студентам альтернативный паттерн загрузки (Full Rebuild) и использование AO Column Store в Greenplum.
- Что:
  - созданы DDL, Load и DQ скрипты для витрины dm.route_performance (эффективность маршрутов).
  - реализована агрегация по бизнес-ключу route_bk для корректной обработки SCD2-измерений.
  - настроен формат хранения AO Column Store с компрессией zstd (уровень 1).
  - обновлены DAGи bookings_dm_ddl и bookings_to_gp_dm для параллельной оркестрации новой витрины.
- Проверка:
  - визуальный аудит SQL-кода на соответствие naming_conventions.md.
  - проверка структуры DAG в Airflow (параллельные ветки load -> dq).
  - наличие бизнес-инварианта total_boarded <= total_tickets в DQ-скрипте.
2026-03-04 21:52:10 +03:00

60 lines
2.7 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- DQ проверки для витрины dm.route_performance.
--
-- Учебные цели:
-- 1. Использование PL/pgSQL блоков (DO $$ ...) для кастомных проверок.
-- 2. Валидация бизнес-инвариантов после загрузки Full Rebuild.
DO $$
DECLARE
row_count INTEGER;
duplicate_count INTEGER;
invalid_metrics_count INTEGER;
null_attributes_count INTEGER;
BEGIN
-- 1. Проверка на наполненность
SELECT COUNT(*) INTO row_count FROM dm.route_performance;
IF row_count = 0 THEN
RAISE EXCEPTION 'DQ Error: Таблица dm.route_performance пуста после загрузки.';
END IF;
-- 2. Проверка на уникальность бизнес-ключа
SELECT COUNT(*) INTO duplicate_count
FROM (
SELECT route_bk FROM dm.route_performance
GROUP BY route_bk HAVING COUNT(*) > 1
) AS q;
IF duplicate_count > 0 THEN
RAISE EXCEPTION 'DQ Error: В dm.route_performance обнаружены дубликаты по route_bk (% шт).', duplicate_count;
END IF;
-- 3. Проверка бизнес-метрик (инварианты)
-- Load factor не может быть отрицательным или физически невозможным (например, более 200%)
SELECT COUNT(*) INTO invalid_metrics_count
FROM dm.route_performance
WHERE avg_load_factor < 0 OR avg_load_factor > 2.0;
IF invalid_metrics_count > 0 THEN
RAISE EXCEPTION 'DQ Error: В dm.route_performance обнаружены некорректные показатели load factor (% строк).', invalid_metrics_count;
END IF;
-- 4. Проверка обязательных атрибутов на NULL
SELECT COUNT(*) INTO null_attributes_count
FROM dm.route_performance
WHERE departure_city IS NULL OR arrival_city IS NULL OR airplane_model IS NULL;
IF null_attributes_count > 0 THEN
RAISE EXCEPTION 'DQ Error: В dm.route_performance обнаружены NULL-значения в обязательных полях (% строк).', null_attributes_count;
END IF;
-- 5. Проверка: посаженных не может быть больше, чем купивших билет
SELECT COUNT(*) INTO invalid_metrics_count
FROM dm.route_performance
WHERE total_boarded > total_tickets;
IF invalid_metrics_count > 0 THEN
RAISE EXCEPTION 'DQ Error: В dm.route_performance total_boarded > total_tickets (% строк).', invalid_metrics_count;
END IF;
RAISE NOTICE 'DQ Success: dm.route_performance успешно прошла все проверки (% строк).', row_count;
END $$;