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