diff --git a/SCD.md b/SCD.md index f4cefa6..48ecdd4 100644 --- a/SCD.md +++ b/SCD.md @@ -271,19 +271,6 @@ WHERE c.customer_id IS NULL OR c.category != n.category; -- условие ве ### 🎯 Как работает этот запрос: пошаговое объяснение -```mermaid -graph TD - A[new_customers
новые данные] --> B[CTE: current_customers] - C[dim_customers_scd2
текущее состояние] --> B - B --> D[LEFT JOIN по customer_id] - A --> D - D --> E{Условие WHERE} - E -->|Новый клиент| F[Вставить запись] - E -->|Изменения| F - E -->|Без изменений| G[Пропустить] - F --> H[dim_customers_scd2
обновленная таблица] -``` - #### Шаг 1: Подготовка данных (CTE current_customers) CTE `current_customers` находит **последнюю версию** каждого клиента из таблицы `dim_customers_scd2`: @@ -317,11 +304,6 @@ LEFT JOIN current_customers c ON n.customer_id = c.customer_id - `uuid()` — генерируем уникальный ключ для новой версии (функция, скобки обязательны) - `COALESCE(n.effective_date, current_date)` — устанавливаем дату начала действия новой версии -> 💡 **Синтаксическая поправка**: -> - `current_date` — это ключевое слово, а не функция, поэтому скобки не нужны -> - `uuid()` — это функция, поэтому скобки обязательны -> - Разница: `current_date` возвращает текущую дату, `uuid()` генерирует уникальный идентификатор - > 💡 **Правильный подход к датам**: В реальных ETL-процессах важно использовать дату из исходных данных, когда она доступна. Мы используем `COALESCE(n.effective_date, current_date)`, что означает: > - Если в `new_customers` есть поле `effective_date` — используем его > - Если нет — используем текущую дату (`current_date`)