Инкрементальная модель dbt накапливает две версии одного заказа
Модель витрины в dbt:
{{ config(materialized='incremental') }}
select order_id, client_id, status, amount, updated_at
from {{ ref('ods_orders') }}
{% if is_incremental() %}
where updated_at > (select max(updated_at) from {{ this }})
{% endif %}
Заказы, у которых меняется статус, попадают в модель повторно, и в витрине оказываются две строки по одному order_id — со старым и новым статусом. Тест unique по order_id падает.
Что исправит ситуацию?
- Сменить материализацию на view: данные всегда будут актуальными, дубли не появятся, а пересчёт возьмёт на себя движок хранилища.
- Заменить условие на updated_at >= (select max(updated_at) from {{ this }}): граница окна станет корректной, и повторные версии перестанут попадать в модель.
- Добавить distinct в select: повторяющиеся заказы схлопнутся при следующем прогоне, и тест unique перестанет падать.
- Задать unique_key = 'order_id' в config: инкрементальная стратегия начнёт заменять существующую строку, а не только добавлять новую.
