Files
de-roadmap/dwh-modeling/sql/07_ddl_hw_customer_status.sql
ddadminandClaude Opus 4.6 f830d54cd7 refactor(sql): улучшено решение домашки как учебный материал
- Зачем:
  - решение домашки должно быть самодостаточным и наглядным для самопроверки
- Что:
  - добавлены контрольные 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>
2026-02-21 14:49:49 +03:00

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
);