dbtSQLdata engineeringаналитикаdata warehouse

dbt для аналитика: первые шаги в 2026

2026-04-25 13 мин

Если в твоей команде ещё нет dbt — ты тратишь время впустую. Ad-hoc SQL-запросы, копипаста между дашбордами, необъяснимые расхождения цифр между отчётами — это всё лечится одним инструментом.

dbt (data build tool) — стандарт де-факто для трансформации данных в современных аналитических стеках. Этот гайд — про то что это, зачем тебе как аналитику и как написать первую модель за 30 минут.


Что такое dbt

Простыми словами: dbt позволяет писать SQL-модели как код. Каждая модель — это .sql файл с SELECT-запросом. dbt сам:

Это превращает SQL-аналитика в SQL-инженера без изучения Python/Spark.

Кто использует dbt
Spotify, Airbnb, Casper, Wise, в РФ — Авито, Wildberries, Тинькофф (частично), Ozon. На рынке РФ 60-70% Senior-аналитик в FAANG-уровне знает dbt минимум на уровне «писал модели».


Зачем аналитику dbt

До dbt

После dbt


Структура проекта dbt

my_project/
├── dbt_project.yml       # main config
├── models/
│   ├── staging/          # очистка raw данных
│   │   ├── stg_users.sql
│   │   ├── stg_orders.sql
│   │   └── stg_events.sql
│   ├── intermediate/     # промежуточные модели
│   │   └── int_user_orders_joined.sql
│   └── marts/            # финальные витрины
│       ├── monthly_revenue.sql
│       └── retention_cohort.sql
├── tests/                # custom tests
├── macros/               # переиспользуемый Jinja-код
└── seeds/                # static CSV (страны, валюты)

Слой staging — копия raw с очисткой типов и переименованием. Слой marts — то что показываем в Tableau/PowerBI.


Первая модель за 5 минут

Шаг 1: установка

pip install dbt-postgres   # или dbt-clickhouse, dbt-snowflake
dbt init my_project
cd my_project

Шаг 2: настройка подключения (~/.dbt/profiles.yml)

my_project:
  target: dev
  outputs:
    dev:
      type: postgres
      host: localhost
      user: analyst
      password: secret
      port: 5432
      dbname: analytics
      schema: dbt_dev

Шаг 3: первая модель

Создай models/staging/stg_orders.sql:

{{ config(materialized='view') }}

SELECT
    id           AS order_id,
    user_id,
    amount::numeric  AS amount,
    created_at::timestamp  AS created_at,
    DATE(created_at) AS order_date
FROM {{ source('raw', 'orders') }}
WHERE created_at >= '2024-01-01'

Шаг 4: запусти

dbt run --select stg_orders

dbt создаст VIEW dbt_dev.stg_orders в твоей БД на основе SELECT'а.


Materialization — главное что нужно знать

config(materialized='X') определяет КАК dbt создаст модель:
ТипЧто создаётКогда использовать
viewCREATE VIEWЛёгкие staging, всегда свежие данные
tableCREATE TABLEТяжёлые расчёты, читают часто
incrementalINSERT новые строкиБольшие event-таблицы
ephemeralCTE inline в зависимых моделяхПромежуточные шаги без storage
{{ config(materialized='incremental', unique_key='event_id') }}

SELECT * FROM {{ source('raw', 'events') }}

{% if is_incremental() %}
WHERE event_ts > (SELECT MAX(event_ts) FROM {{ this }})
{% endif %}

При dbt run --full-refresh — пересчитает таблицу с нуля. При обычном run — только новые данные.


Зависимости через ref()

В моделях ссылайся на другие модели через {{ ref('model_name') }}:

-- models/marts/monthly_revenue.sql
SELECT
    DATE_TRUNC('month', order_date) AS month,
    SUM(amount) AS revenue,
    COUNT(DISTINCT user_id) AS unique_buyers
FROM {{ ref('stg_orders') }}
GROUP BY DATE_TRUNC('month', order_date)

dbt автоматически:

dbt run                # запустит все модели в правильном порядке
dbt run --select monthly_revenue+   # эта и все зависимые

Тесты

Создай models/staging/_stg_orders.yml:

version: 2
models:
  - name: stg_orders
    columns:
      - name: order_id
        tests:
          - unique
          - not_null
      - name: amount
        tests:
          - not_null
      - name: user_id
        tests:
          - relationships:
              to: ref('stg_users')
              field: user_id

Запусти:

dbt test --select stg_orders

dbt сам сгенерит SQL-запросы которые проверяют unique/not_null/foreign keys, и упадёт с ошибкой если есть violations. Это уже production-grade data quality на минимуме усилий.


Документация

dbt docs generate   # генерит метаданные
dbt docs serve      # открывает локальный сайт http://localhost:8080

Получаешь автогенерированный сайт с:


Реальные кейсы где dbt спасает

«Цифры расходятся между дашбордами»

Раньше: один Tableau считает MAU за последние 30 дней, другой — за календарный месяц. Спорят.

С dbt: одна модель mart_active_users, оба дашборда читают её. Источник истины ОДИН.

«Откуда взялась эта таблица?»

Раньше: коллега уволился, осталась таблица final_revenue_FINAL_2_v3. Никто не знает что в ней.

С dbt: каждая модель — git commit с автором, описанием, тестами.

«Изменили API → отвалились отчёты»

Раньше: продакт ничего не знал, заметил через неделю.

С dbt: тест relationships упал на nightly run, ты получил alert утром.

«Долго пересчитывается агрегат»

Раньше: каждое утро full re-aggregate 100M строк.

С dbt: materialized='incremental' — только новые данные. Агрегат обновляется за минуту, не за час.


Что НЕ нужно делать в dbt


Roadmap для аналитика

СрокЧто освоить
1 неделяУстановка, первая модель, materializations
2 неделяref(), source(), incremental, тесты
1 месяцmacros, Jinja, документация, exposures
2-3 месяцаdbt Cloud, dbt Power User для VS Code, dbt-utils
6 месяцевАрхитектура staging/intermediate/marts на 50+ моделях

Связанные материалы

Установи dbt прямо сейчас (pip install dbt-postgres), напиши первую модель из 5 строк. Через час dbt будет твоим главным инструментом — серьёзно. После этого вернись в SQL-тренажёр и потренируй CTE — это core dbt-моделей.

Прокачай SQL для dbt
dbt — это про SQL. У нас 425 SQL-задач для практики на любую тему. Первые 5 бесплатно.
Открыть SQL-тренажёр →