Зачем: помочь начинающему инженеру проследить событие и версию заказа от генератора до хранилища, включая ошибки и повторные поступления. Что: обновлены вводная генератора, справочники приема и модели заказа, разделы хранилища и комментарии SQL и дага. Сохранены технические условия; исполняемый код, схемы и поведение стенда не изменены. Проверка: make lint, git diff --check, 142 локальные ссылки и справка CLI. SQL без комментариев и Python AST без строк документации совпали с исходными. Генерация данных и сброс состояния не выполнялись. Refs #250
43 lines
2.5 KiB
SQL
43 lines
2.5 KiB
SQL
-- Дни пересборки заказов: first_day и last_day, обе границы включены.
|
|
-- Текущее окно — дни оформления заказов из последнего snapshot_date.
|
|
-- Если в DDS нет дня, который есть в ODS, отрезок расширяется до первого
|
|
-- такого дня. Это восстанавливает пропуски даже за пределами текущего окна.
|
|
--
|
|
-- Дата слепка у актуальной версии показывает последнее наблюдение заказа
|
|
-- (ADR 0014). Поэтому окно берется из данных, без копирования константы
|
|
-- генератора. FINAL здесь не нужен: created_at одинаков у всех версий,
|
|
-- а строки последнего слепка сохраняются при слияниях.
|
|
--
|
|
-- Пустой ODS не дает строки результата; даг завершится ошибкой.
|
|
-- Точка с запятой в конце не нужна: клиент дописывает FORMAT ответа.
|
|
-- Порядок пересборки — docs/architecture/etl.md, «Объём прогона».
|
|
|
|
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,
|
|
-- GLOBAL NOT IN сравнивает дни со всем DDS. Локальное сравнение могло бы
|
|
-- счесть день пропущенным, если его заказы находятся на соседнем шарде.
|
|
-- minOrNull возвращает NULL, когда пропущенных дней нет.
|
|
(
|
|
SELECT minOrNull(day)
|
|
FROM (
|
|
SELECT DISTINCT toDate(toTimeZone(created_at, 'Europe/Samara')) AS day
|
|
FROM ods.order_dist
|
|
)
|
|
WHERE day GLOBAL NOT IN (SELECT order_date FROM dds.order_dist)
|
|
) AS first_missing_day
|
|
SELECT
|
|
-- Начало окна или первый пропущенный день, если он раньше.
|
|
least(window_start, coalesce(first_missing_day, window_start)) AS first_day,
|
|
window_end AS last_day
|
|
WHERE (SELECT count() FROM ods.order_dist) > 0
|