Короткий ответ
Grain — точное описание одной строки таблицы. Например, факт заказов имеет одну строку на заказ, а факт позиций — одну строку на товар в заказе.
Как это работает подробнее
Грануляция задаёт естественный ключ и определяет, какие показатели можно суммировать. Соединение с таблицей более детального уровня размножает исходные строки, если данные заранее не агрегировать.
- Перед JOIN. Сравните grain обеих сторон и кардинальность ключа.
- Перед SUM. Убедитесь, что метрика хранится именно на уровне строки результата.
Пример кода
safe_order_join.sql
WITH item_totals AS (
SELECT order_id, SUM(item_amount) AS items_amount
FROM fact_order_items
GROUP BY order_id
)
SELECT SUM(i.items_amount) AS revenue
FROM fact_orders AS o
JOIN item_totals AS i ON i.order_id = o.order_id;Что использовать на практике
- Документируйте grain одной короткой фразой в описании каждой фактовой таблицы.
- Проверяйте уникальность предполагаемого ключа и суммы до и после соединения.
Подводные камни
- Неявная детализация. Название таблицы не гарантирует одну строку на заказ.
- Суммирование после one-to-many JOIN. Метрика родительской таблицы будет повторена для каждой дочерней строки.