Files
clickstream-data-platform/sql/dm/revenue_daily_rebuild.sql
T
ddadmin 086007fbd4 docs(warehouse): объяснены расчет строк и замена дневных разделов
Зачем: выражения «собираются в донор» и «публикуются дни» требовали
знать устройство конвейера до чтения объяснения.

Что: описаны назначение промежуточных таблиц и последовательность
расчета, записи и замены разделов. Перечитаны остальные объяснения:
выбор дней, разворачивание позиций заказа, проверка сессий и повтор запуска.

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

Refs: #249
2026-09-13 15:16:26 -04:00

60 lines
2.5 KiB
SQL

-- DM: расчет выручки за дни от first_day до last_day включительно.
-- DROP PARTITION ALL очищает промежуточную revenue_daily_stage_rep.
-- Затем INSERT записывает по одной строке итогов на день и категорию товара.
-- Основная revenue_daily_rep остается прежней до revenue_daily_replace.sql.
-- В расчет входят только оплаченные заказы. 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;