«Объясни разницу между FIXED, INCLUDE и EXCLUDE» — это вопрос-фильтр на любом собесе Tableau-аналитика. Если путаешь, значит не делал ничего сложнее column chart. Если знаешь — можешь строить нетривиальные visualizations.
LOD (Level of Detail) — это expressions в Tableau, которые позволяют считать агрегаты на другом уровне детализации, чем уровень визуала. Звучит абстрактно — на примерах поймёшь сразу.
Что такое уровень детализации (LOD)
В Tableau любой визуал имеет уровень детализации (Viz LOD) — это набор измерений, которые ты положил в визуал.
Пример:
- Положил Region в Columns и Category в Rows → Viz LOD = [Region, Category]
- Просто Region в Columns → Viz LOD = [Region]
По умолчанию любая мера (SUM, AVG) считается на Viz LOD. Если ты хочешь посчитать что-то на другом уровне — нужны LOD expressions.
FIXED — фиксированный уровень
{ FIXED [Region] : SUM([Sales]) }
Считает SUM(Sales) для каждого Region — независимо от того, что в визуале.
Когда: % of total, ratio к фиксированной базе, когортный анализ.
Пример 1. % of region total
Хочешь показать долю category от total по region:
SUM([Sales]) / { FIXED [Region] : SUM([Sales]) }
В визуале с Region+Category → каждая bar показывает свою долю от total своего региона.
Пример 2. First Purchase Date per Customer
{ FIXED [Customer ID] : MIN([Order Date]) }
Используется для cohort анализа — определяет в какую когорту попал customer.
INCLUDE — добавить детализацию
{ INCLUDE [Subcategory] : AVG([Profit]) }
Считает AVG(Profit) на уровне Viz LOD плюс Subcategory — даже если Subcategory НЕ в визуале.
Когда: усреднение по более гранулярному уровню, чем визуал.
Пример 3. Average Subcategory Profit per Region
В визуале Region (без Subcategory). Хочешь показать средний profit по Subcategory:
{ INCLUDE [Subcategory] : AVG([Profit]) }
В визуале Region → для каждого региона видишь средний profit по subcategory'ям внутри. Если бы делал просто AVG(Profit), он бы считал на уровне Region (одно среднее), а не on average of subcategories.
EXCLUDE — убрать детализацию
{ EXCLUDE [Category] : SUM([Sales]) }
Считает SUM(Sales) без учёта Category — даже если Category в визуале.
Когда: "Sales вне Category", percent of region total в визуале с Category.
Пример 4. Sales per Region (independent from Category)
В визуале Region+Category. Хочешь показать total по Region (одинаковый для всех category в регионе):
{ EXCLUDE [Category] : SUM([Sales]) }
Получаешь Sum(Sales) на уровне Region — как если бы Category не было в визуале.
Разница FIXED / INCLUDE / EXCLUDE на одном примере
Допустим, визуал — Region+Category, мера Sales. Что считает каждое LOD:
| Expression | Что считает |
|---|---|
SUM(Sales) | На уровне Region+Category (default) |
{ FIXED [Region] : SUM([Sales]) } | Только Region (плевать на Category в визуале) |
{ INCLUDE [Customer] : SUM([Sales]) } | Region+Category+Customer (более детально, чем визуал) |
{ EXCLUDE [Category] : SUM([Sales]) } | Только Region (как FIXED [Region], но проще писать) |
FIXED vs EXCLUDE: оба дают одинаковый результат, но синтаксически разные. FIXED — указываешь что оставить. EXCLUDE — указываешь что убрать. Используй EXCLUDE когда хочешь убрать одно измерение из визуала, FIXED — когда хочешь зафиксировать на конкретном уровне.
Шаг 1: Определи Viz LOD
Что в Columns / Rows / Detail? Это и есть Viz LOD. Например: Region+Category.
Шаг 2: Определи нужный LOD
Если хочешь Total per Region — нужен LOD = [Region]. Если average по Subcategory — нужен LOD = [Region, Category, Subcategory].
Шаг 3: Выбери FIXED / INCLUDE / EXCLUDE
- Нужный LOD = подмножество Viz LOD → EXCLUDE
- Нужный LOD = supermножество Viz LOD → INCLUDE
- Нужный LOD не зависит от Viz LOD → FIXED
Шаг 4: Учитывай filter order
В Tableau filters применяются в порядке: Context filters → FIXED → Dimension filters → INCLUDE/EXCLUDE → Measure filters.
FIXED игнорирует обычные фильтры. Если хочешь чтобы FIXED уважал фильтр — сделай его context filter (или используй INCLUDE/EXCLUDE).
Пример 5. Когорт анализ с filter trick
First Order Date = { FIXED [Customer ID] : MIN([Order Date]) }
Если фильтр по Region — FIXED игнорирует, считает First Order для всех заказов. Это обычно правильно для когорт. Если хочешь только Moscow → сделай Region context filter.
Пример 6. Top-N customers per Region
INDEX() <= 5
-- В Table Calculation: Compute Using → Customer
-- Restart by → Region
Или через LOD + RANK:
{ FIXED [Region] : RANK_DENSE(SUM([Sales]), 'desc') }
Что НЕ делать (anti-patterns)
1. Не используй FIXED когда работает INCLUDE/EXCLUDE. FIXED игнорирует фильтры — это часто bug, а не feature. INCLUDE/EXCLUDE уважают фильтры.
2. Не пиши LOD внутри LOD. Tableau поддерживает, но performance падает. Лучше посчитать на уровне SQL/Prep и положить в data.
3. Не зацикливайся на LOD. Если можешь сделать через простую Quick Table Calculation (% of total, running total) — делай. LOD — для нестандартных вычислений.
4. Не комбинируй с table calcs без понимания order. Table calcs работают после LOD. Если результат странный — это часто issue фильтр / LOD / table calc order.
Частые вопросы
FIXED vs Context filter — что выбрать?
Если LOD должен реагировать на конкретные фильтры — сделай эти фильтры context filters (Right-click filter → "Add to Context"). FIXED будет учитывать их. Остальные фильтры игнорируются как обычно.
LOD замедляет дашборд?
Да, FIXED особенно — каждый LOD требует отдельного SQL-запроса. Если дашборд медленный — сделай LOD в data prep слое (Tableau Prep, dbt) и положи как обычные колонки.
Можно ли заменить LOD через Table Calculation?
Иногда да. Например, % of total через LOD vs SUM(Sales) / TOTAL(SUM(Sales)). Но table calcs работают на data в визуале, LOD — на data до фильтрации. Это разное.
Что значит [Region] = ATTR([Region]) в LOD?
Это hack для context-aware LOD. ATTR возвращает значение, если оно уникально в текущем контексте. Использовали раньше до появления INCLUDE/EXCLUDE. Сейчас редко нужно.
Как мигрировать LOD на Power BI DAX?
- FIXED → CALCULATE с ALL и нужными фильтрами
- INCLUDE → SUMX over taблицу с дополнительной группировкой
- EXCLUDE → CALCULATE с ALL для исключаемого измерения
Принцип похож, синтаксис другой.
Связанные ресурсы
- 🧪 BI-песочница — собирай дашборды без Tableau license
- 📊 Power BI DAX основы — конкурирующий стек
- 📝 Yandex DataLens пошагово — RU-альтернатива
- 🎯 Tableau / Power BI / DataLens / Superset сравнение
- 💼 Топ-50 вопросов с собеса аналитика
Источники
- Tableau Docs: «LOD Expressions overview» (help.tableau.com)
- Tableau Conference Sessions «LOD Deep Dive» (tableau.com/community)
- Habr: «LOD выражения Tableau» (habr.com)
LOD — это сильный инструмент, но 80% дашбордов можно делать без них через простые agg + filters. Не усложняй ради усложнения. Хочешь практику без Tableau-лицензии? BI-песочница даст похожий опыт.