Files
clickstream-data-platform/sql/dq/revenue_daily_vs_dds.sql
T
ddadmin 26b2e5fea1 feat(dq): добавлен контроль качества конвейера
- Зачем:
  - конвейеру нужна публикуемая сводка текущего качества с красным завершением при нарушении договоров.
- Что:
  - добавлены DDL, публичное представление и пять сверок на естественном деловом зерне.
  - даг dq_check встроен после DM и публикует полные дневные партиции до именованных утверждений.
  - параллелизм DDS, DM и DQ приведён к измеренному лимиту памяти планировщика.
- Проверка:
  - make lint; make config-test; make rebuild-storage.
  - make smoke; make check-clickhouse; make check-services.
  - три семейства проверок покрашены искусственными расхождениями и восстановлены повторным полным прогоном.
2026-08-27 07:55:28 -04:00

78 lines
2.8 KiB
SQL

-- DQ: дневная выручка против прямого агрегата заказов DDS.
--
-- День берётся из объединения сторон. Поэтому исчезнувший целиком день или
-- категория остаются видимы. Денежный расчет повторяет публичный договор
-- витрины и сохраняет Decimal до округления AOV.
WITH
reference AS
(
SELECT
report_date,
product_category,
orders,
units,
CAST(revenue, 'Decimal(18, 2)') AS revenue,
CAST(
round(divideDecimal(revenue, toDecimal128(orders, 0), 6), 2),
'Decimal(18, 2)'
) AS aov
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'
GROUP BY
report_date,
product_category
)
),
actual AS
(
SELECT
report_date,
product_category,
count() AS physical_rows,
any(orders) AS orders,
any(units) AS units,
any(revenue) AS revenue,
any(aov) AS aov
FROM dm.revenue_daily_v
GROUP BY
report_date,
product_category
)
SELECT
coalesce(reference.report_date, actual.report_date) AS data_date,
coalesce(reference.product_category, actual.product_category) AS business_key,
isNotNull(reference.product_category) AS reference_present,
isNotNull(actual.product_category) AS actual_present,
toString(tuple(reference.orders, reference.units, reference.revenue, reference.aov))
AS reference_value,
concat(
toString(tuple(actual.orders, actual.units, actual.revenue, actual.aov)),
', rows=',
toString(actual.physical_rows)
) AS actual_value,
isNull(reference.product_category)
OR isNull(actual.product_category)
OR actual.physical_rows != 1
OR NOT isNotDistinctFrom(reference.orders, actual.orders)
OR NOT isNotDistinctFrom(reference.units, actual.units)
OR NOT isNotDistinctFrom(reference.revenue, actual.revenue)
OR NOT isNotDistinctFrom(reference.aov, actual.aov) AS failed
FROM reference
GLOBAL FULL OUTER JOIN actual USING (report_date, product_category)
ORDER BY
data_date,
business_key
SETTINGS join_use_nulls = 1