- Зачем: - решение домашки должно быть самодостаточным и наглядным для самопроверки - Что: - добавлены контрольные SELECT после каждого блока (ODS, DDS, инкремент, DM) - блок 3 (инкремент) стал самодостаточным: загрузка в STG + UPSERT в ODS + SCD2 - DDL витрины вынесен из решения/шаблона/домашки в 07_ddl_hw_customer_status.sql - предусловия в домашке дополнены (05_ddl_dm.sql, пояснение про dim_date) - в шапку решения добавлено напоминание сначала попробовать самостоятельно - Проверка: - визуальная проверка diff Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
57 lines
2.2 KiB
SQL
57 lines
2.2 KiB
SQL
-- ===============================================
|
|
-- DDL: дополнительные таблицы для домашки
|
|
-- Тема: статусы клиента (SCD2 поверх статуса)
|
|
-- Скрипт можно запускать после 01_ddl_stg-dds.sql
|
|
-- ===============================================
|
|
|
|
-- 1. STG: сырые события о статусе клиента из CRM
|
|
DROP TABLE IF EXISTS stg.customer_status_raw;
|
|
CREATE TABLE stg.customer_status_raw (
|
|
customer_id TEXT,
|
|
status TEXT,
|
|
event_ts TEXT,
|
|
_load_id TEXT,
|
|
_load_ts TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
-- 2. ODS: очищенные и типизированные статусы
|
|
DROP TABLE IF EXISTS ods.customer_status;
|
|
CREATE TABLE ods.customer_status (
|
|
customer_id INT NOT NULL,
|
|
status VARCHAR(20) NOT NULL,
|
|
event_ts TIMESTAMP NOT NULL,
|
|
_load_id TEXT NOT NULL,
|
|
_load_ts TIMESTAMP NOT NULL
|
|
);
|
|
|
|
ALTER TABLE ods.customer_status
|
|
ADD PRIMARY KEY (customer_id, event_ts);
|
|
|
|
-- 3. DDS: измерение статусов клиента с историей (SCD Type 2)
|
|
DROP TABLE IF EXISTS dds.dim_customer_status;
|
|
CREATE TABLE dds.dim_customer_status (
|
|
customer_status_sk BIGSERIAL PRIMARY KEY,
|
|
customer_bk INT NOT NULL,
|
|
status VARCHAR(20) NOT NULL,
|
|
hashdiff TEXT NOT NULL,
|
|
valid_from DATE NOT NULL,
|
|
valid_to DATE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
ALTER TABLE dds.dim_customer_status
|
|
ADD CONSTRAINT uq_dim_customer_status_bk_from UNIQUE (customer_bk, valid_from);
|
|
|
|
CREATE INDEX ix_dim_customer_status_bk_current
|
|
ON dds.dim_customer_status (customer_bk)
|
|
WHERE valid_to IS NULL;
|
|
|
|
-- 4. DM: витрина статусов клиентов по датам (опциональная часть домашки)
|
|
DROP TABLE IF EXISTS dm.mart_customer_status_daily;
|
|
CREATE TABLE dm.mart_customer_status_daily (
|
|
date_actual DATE NOT NULL,
|
|
status VARCHAR(20) NOT NULL,
|
|
customers_cnt INT NOT NULL
|
|
);
|