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. - три семейства проверок покрашены искусственными расхождениями и восстановлены повторным полным прогоном.
This commit is contained in:
1 parent
4e60aafc31
commit
26b2e5fea1
17 files changed
+753
-38
No files matched your search
@@ -0,0 +1,77 @@
|
||||
-- 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
|
||||
Reference in new issue
Block a user