-- 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;