Зачем: выражения «собираются в донор» и «публикуются дни» требовали знать устройство конвейера до чтения объяснения. Что: описаны назначение промежуточных таблиц и последовательность расчета, записи и замены разделов. Перечитаны остальные объяснения: выбор дней, разворачивание позиций заказа, проверка сессий и повтор запуска. Проверка: make lint, git diff --check, локальные ссылки и якоря. SQL без комментариев и AST обоих дагов без строк документации не изменились. Refs: #249
60 lines
2.5 KiB
SQL
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;
|