Зачем: читателю ступеней 1–4 нужно проследить выбор дней, расчет строки и публикацию результата без расшифровки метафор. Что: согласованы справочники DM, сессий, ETL и два раздела хранилища с комментариями шести SQL-примеров. Уточнены ограничения повторного запуска и выбора атрибутов при равном времени событий. Проверка: make lint, git diff --check, локальные Markdown-ссылки и якоря. SQL без комментариев совпадает; AST Python без строк документации совпадает. Исторические разделы и материалы вне границ задачи сохранены. Refs: #249
58 lines
2.2 KiB
SQL
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;
|