- Зачем: - убрать путаницу, дублирование и неточности в демо-скриптах и домашке - Что: - CSV: заголовок load_ts → _load_ts во всех файлах (совпадает с именем в таблицах) - домашка: убраны оговорки о расхождении load_ts/_load_ts, добавлена ссылка на эталонное решение - 09_dml_hw_customer_status_solution.sql: эталонное решение скопировано из ветки solution/hw_customer_status в основную - 02_dml: добавлена карта загрузки в шапку (что откуда строится) - 05_ddl_dm + 06_dml_dm: total_orders → total_line_items (название точнее отражает содержимое) - Проверка: - визуальная проверка diff, скрипты не запускались (демо-стенд не поднят) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
35 lines
1.4 KiB
SQL
35 lines
1.4 KiB
SQL
-- ===============================================
|
|
-- DDL: Data Marts (DM)
|
|
-- Слой "готовых решений" — для BI, отчётов, API
|
|
-- ===============================================
|
|
|
|
DROP SCHEMA IF EXISTS dm CASCADE;
|
|
CREATE SCHEMA dm;
|
|
|
|
-- Витрина: ежедневные продажи по товарам и клиентам
|
|
-- Гранулярность: 1 строка = 1 день × 1 товар × 1 сегмент клиента
|
|
CREATE TABLE dm.mart_daily_sales (
|
|
date_actual DATE NOT NULL,
|
|
product_name VARCHAR(100) NOT NULL,
|
|
customer_segment VARCHAR(20) NOT NULL, -- напр. 'Premium', 'Basic'
|
|
total_qty INT NOT NULL,
|
|
total_revenue NUMERIC(18,2) NOT NULL
|
|
);
|
|
|
|
-- Витрина: 360°-портрет клиента (lifetime value)
|
|
CREATE TABLE dm.mart_customer_360 (
|
|
customer_bk INT NOT NULL,
|
|
first_order_date DATE,
|
|
last_order_date DATE,
|
|
total_line_items INT NOT NULL,
|
|
total_items INT NOT NULL,
|
|
lifetime_value NUMERIC(18,2) NOT NULL,
|
|
last_email VARCHAR(100),
|
|
last_city VARCHAR(50)
|
|
);
|
|
|
|
-- Индексы для ускорения BI (опционально, но рекомендовано)
|
|
CREATE INDEX ON dm.mart_daily_sales (date_actual);
|
|
CREATE INDEX ON dm.mart_daily_sales (product_name);
|
|
CREATE INDEX ON dm.mart_customer_360 (customer_bk);
|