Files
clickstream-data-platform/sql/dm/revenue_daily_rebuild.sql
T
ddadmin 5f317ba8d2 docs(warehouse): упрощены объяснения витрин, сессий и пересчета
Зачем: читателю ступеней 1–4 нужно проследить выбор дней, расчет строки
и публикацию результата без расшифровки метафор.

Что: согласованы справочники DM, сессий, ETL и два раздела хранилища
с комментариями шести SQL-примеров. Уточнены ограничения повторного
запуска и выбора атрибутов при равном времени событий.

Проверка: make lint, git diff --check, локальные Markdown-ссылки и якоря.
SQL без комментариев совпадает; AST Python без строк документации совпадает.
Исторические разделы и материалы вне границ задачи сохранены.

Refs: #249
2026-09-13 14:33:39 -04:00

58 lines
2.2 KiB
SQL

-- DM: сборка выручки за выбранный диапазон в донор.
-- DROP PARTITION ALL очищает донор на каждом узле. Вставка ниже дает
-- одну строку на день заказа и категорию товара: только оплаченные заказы.
-- ARRAY JOIN разворачивает согласованные позиции трех массивов вместе.
-- Причина выбора DROP вместо TRUNCATE — в sql/dds/order_rebuild.sql.
ALTER TABLE dm.revenue_daily_stage_rep ON CLUSTER clickstream_cluster
DROP PARTITION ALL;
INSERT INTO dm.revenue_daily_stage_dist
(
report_date,
product_category,
orders,
units,
revenue,
aov,
_load_id,
_load_ts
)
SELECT
report_date,
product_category,
orders,
units,
CAST(revenue, 'Decimal(18, 2)'),
-- Делим с шестью знаками после запятой, затем округляем до копеек.
-- Так дробная часть сохраняется до округления среднего чека.
CAST(
round(divideDecimal(revenue, toDecimal128(orders, 0), 6), 2),
'Decimal(18, 2)'
),
{load_id:String},
now64(3, 'UTC')
FROM
(
SELECT
order_date AS report_date,
dictGet('dic.products', 'category', item_sku) AS product_category,
uniqExact(order_id) AS orders,
sum(item_quantity) AS units,
sum(item_price * item_quantity) AS revenue
FROM dds.order_v
ARRAY JOIN
item_sku,
item_quantity,
item_price
WHERE status = 'paid'
AND order_date BETWEEN {first_day:Date} AND {last_day:Date}
GROUP BY
report_date,
product_category
)
-- Источник распределен по заказу, цель — по категории. Значение 0 оставляет
-- итоговую агрегацию и распределение по ключу цели на ноде, принявшей запрос.
-- distributed_foreground_insert = 1 ждет доставки строк перед заменой.
SETTINGS distributed_foreground_insert = 1,
parallel_distributed_insert_select = 0;