74 lines
3.2 KiB
SQL
74 lines
3.2 KiB
SQL
-- ===============================================
|
||
-- Проверки качества данных после загрузки STG→ODS→DDS
|
||
-- Запускается после 02_dml_stg-dds.sql (и, при необходимости, 03_demo_increment.sql)
|
||
-- ===============================================
|
||
|
||
-- 1. Проверка: dim_customer не пуста
|
||
DO $$
|
||
BEGIN
|
||
ASSERT (SELECT COUNT(*) FROM dds.dim_customer) > 0,
|
||
'ОШИБКА: таблица dds.dim_customer пуста — загрузка не прошла';
|
||
RAISE NOTICE '✅ dim_customer: НЕ ПУСТА (всего строк: %)',
|
||
(SELECT COUNT(*) FROM dds.dim_customer);
|
||
END $$;
|
||
|
||
-- 2. Проверка: каждая строка из ODS попала в DDS-факт
|
||
-- Сравниваем количество строк в ods.order_items и dds.fact_sales
|
||
DO $$
|
||
DECLARE
|
||
expected_count bigint;
|
||
actual_count bigint;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO expected_count FROM ods.order_items;
|
||
SELECT COUNT(*) INTO actual_count FROM dds.fact_sales;
|
||
--
|
||
ASSERT actual_count = expected_count,
|
||
format('ОШИБКА: в fact_sales %s строк, а в ods.order_items — %s. Разница: %s',
|
||
actual_count, expected_count, expected_count - actual_count);
|
||
--
|
||
RAISE NOTICE '✅ fact_sales: количество строк совпадает с ods.order_items (%)', actual_count;
|
||
END $$;
|
||
|
||
-- 3. Проверка SCD Type 2: у клиента 101 должно быть ≥2 версий (из-за смены email)
|
||
DO $$
|
||
DECLARE version_count INT;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO version_count
|
||
FROM dds.dim_customer
|
||
WHERE customer_bk = 101;
|
||
--
|
||
ASSERT version_count >= 2,
|
||
FORMAT('ОШИБКА: у клиента 101 только %s версия, ожидается ≥2 (должна быть история)', version_count);
|
||
RAISE NOTICE '✅ SCD Type 2: клиент 101 имеет % версий — история сохранена', version_count;
|
||
END $$;
|
||
|
||
-- 4. Проверка SCD Type 2: у каждого клиента ровно одна актуальная версия (valid_to IS NULL)
|
||
DO $$
|
||
DECLARE
|
||
customers_cnt BIGINT;
|
||
current_cnt BIGINT;
|
||
BEGIN
|
||
SELECT COUNT(DISTINCT customer_bk) INTO customers_cnt FROM dds.dim_customer;
|
||
SELECT COUNT(*) INTO current_cnt
|
||
FROM dds.dim_customer
|
||
WHERE valid_to IS NULL;
|
||
--
|
||
ASSERT current_cnt = customers_cnt,
|
||
FORMAT('ОШИБКА: актуальных строк %s, а уникальных клиентов %s (ожидается 1 current на клиента)',
|
||
current_cnt, customers_cnt);
|
||
RAISE NOTICE '✅ SCD Type 2: current-строки = количеству клиентов (%)', current_cnt;
|
||
END $$;
|
||
|
||
-- 5. Проверка SCD Type 2: периоды корректны (valid_to > valid_from или valid_to IS NULL)
|
||
DO $$
|
||
BEGIN
|
||
ASSERT NOT EXISTS (
|
||
SELECT 1
|
||
FROM dds.dim_customer
|
||
WHERE valid_to IS NOT NULL
|
||
AND valid_to <= valid_from
|
||
),
|
||
'ОШИБКА: найдены строки dim_customer с некорректным периодом (valid_to <= valid_from)';
|
||
RAISE NOTICE '✅ SCD Type 2: периоды valid_from/valid_to корректны';
|
||
END $$;
|