fix(modeling): пример витрины в README приведён в соответствие со скриптами

- customer_segment: убрана несуществующая колонка dim_customer, заменена
  на CASE по сумме (как в 06_dml_dm.sql)
- MATERIALIZED VIEW заменён на TRUNCATE + INSERT INTO (как в скриптах),
  упоминание MV оставлено в ремарке
- добавлен комментарий о недетерминированности CURRENT_DATE в bounds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-21 19:21:39 +03:00
co-authored by Claude Opus 4.6
parent c6a20f3cf7
commit b3826f47cb
2 changed files with 15 additions and 8 deletions
+13 -8
View File
@@ -544,11 +544,17 @@ flowchart TD
```sql
-- mart_daily_sales: ежедневные продажи с сегментацией
CREATE MATERIALIZED VIEW dm.mart_daily_sales AS
-- Полная пересборка (full refresh) - для простоты; в продакшене бывает incremental.
TRUNCATE dm.mart_daily_sales;
INSERT INTO dm.mart_daily_sales (
date_actual, product_name, customer_segment, total_qty, total_revenue
)
SELECT
d.date_actual AS order_date,
d.date_actual,
p.product_name,
c.customer_segment, -- например: 'Premium', 'Basic'
-- Сегмент определяем по сумме строки (в реальности может быть атрибутом клиента)
CASE WHEN f.amount >= 200 THEN 'Premium' ELSE 'Basic' END AS customer_segment,
SUM(f.quantity) AS total_qty,
SUM(f.amount) AS total_revenue
FROM dds.fact_sales f
@@ -557,13 +563,12 @@ JOIN dds.dim_date d
JOIN dds.dim_product p
ON f.product_sk = p.product_sk
JOIN dds.dim_customer c
ON f.customer_sk = c.customer_sk
AND d.date_actual >= c.valid_from
AND (c.valid_to IS NULL OR d.date_actual < c.valid_to) -- SCD!
GROUP BY d.date_actual, p.product_name, c.customer_segment;
ON f.customer_sk = c.customer_sk -- факт ссылается на нужную версию SK
GROUP BY d.date_actual, p.product_name,
CASE WHEN f.amount >= 200 THEN 'Premium' ELSE 'Basic' END;
```
> 💡 **Материализованное представление (MATERIALIZED VIEW)** — это «кэш» результата. Обновляется по расписанию (например, ночью).
> 💡 В продакшене витрину иногда оформляют как **MATERIALIZED VIEW** - «кэш» результата запроса, который обновляется по расписанию. В нашем примере используем обычную таблицу с `TRUNCATE` + `INSERT` - для учебных целей это нагляднее.
✏️ **Попробуйте сами:** [Домашка: статусы клиента от STG до DDS (и немного DM)](Homework_Customer_Status_DDS_DM.md) — пройдёте тот же путь, но самостоятельно.
@@ -311,6 +311,8 @@ WITH bounds AS (
min(valid_from) AS date_from,
-- CURRENT_DATE для открытых интервалов (valid_to IS NULL = текущий статус),
-- иначе витрина не покроет даты после последней смены статуса.
-- Нюанс: количество строк в витрине зависит от даты запуска (каждый
-- день добавляется ещё один день). Для учебных целей это приемлемо.
max(coalesce(valid_to, CURRENT_DATE)) AS date_to
FROM dds.dim_customer_status
)