Зачем: выражения «собираются в донор» и «публикуются дни» требовали знать устройство конвейера до чтения объяснения. Что: описаны назначение промежуточных таблиц и последовательность расчета, записи и замены разделов. Перечитаны остальные объяснения: выбор дней, разворачивание позиций заказа, проверка сессий и повтор запуска. Проверка: make lint, git diff --check, локальные ссылки и якоря. SQL без комментариев и AST обоих дагов без строк документации не изменились. Refs: #249
36 lines
2.0 KiB
SQL
36 lines
2.0 KiB
SQL
-- DM: диапазон пересборки выручки, first_day и last_day включительно.
|
|
-- Последний слепок ODS задает даты оформления заказов, которые еще могут
|
|
-- измениться. Саму выручку считаем по DDS; ODS нужен только для выбора дат.
|
|
-- Левая граница расширяется до первого дня с оплаченными заказами DDS,
|
|
-- которого нет в витрине. Так первый запуск охватывает историю выручки.
|
|
-- По наличию даты нельзя обнаружить частично заполненный день.
|
|
--
|
|
-- Точки с запятой в конце нет: драйвер добавляет FORMAT к этому запросу.
|
|
WITH
|
|
(SELECT max(snapshot_date) FROM ods.order_dist) AS last_snapshot,
|
|
(
|
|
SELECT min(toDate(toTimeZone(created_at, 'Europe/Samara')))
|
|
FROM ods.order_dist
|
|
WHERE snapshot_date = last_snapshot
|
|
) AS window_start,
|
|
(
|
|
SELECT max(toDate(toTimeZone(created_at, 'Europe/Samara')))
|
|
FROM ods.order_dist
|
|
WHERE snapshot_date = last_snapshot
|
|
) AS window_end,
|
|
(
|
|
SELECT minOrNull(report_date)
|
|
FROM (SELECT DISTINCT order_date AS report_date FROM dds.order_v WHERE status = 'paid')
|
|
-- GLOBAL собирает список дней витрины со всех шардов.
|
|
WHERE report_date GLOBAL NOT IN (
|
|
SELECT report_date FROM dm.revenue_daily_dist
|
|
)
|
|
) AS first_missing_day
|
|
SELECT
|
|
least(window_start, coalesce(first_missing_day, window_start)) AS first_day,
|
|
window_end AS last_day
|
|
-- Для выбора диапазона нужны заказы в ODS, для расчета — в DDS.
|
|
-- Эта проверка наличия строк не подтверждает полноту источников.
|
|
WHERE (SELECT count() FROM dds.order_v) > 0
|
|
AND (SELECT count() FROM ods.order_dist) > 0
|