Всем привет! На связи Валерия Елпатьевская, ментор курса «Инженер данных» 👋🏻
Вчера я давала задачу на ежедневный отчёт о продажах, сегодня несу решение 👇🏻
SQL-запрос:
WITH deduped AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY updated_at DESC) as rn
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '1 day'
AND order_date < CURRENT_DATE
),
metrics AS (
SELECT
COUNT(*) AS total_orders,
SUM(amount) AS total_revenue,
ROUND(AVG(amount), 2) AS avg_check
FROM deduped
WHERE rn = 1 AND status = 'paid'
)
SELECT
CURRENT_DATE - INTERVAL '1 day' AS report_date, -- бизнес-дата отчёта
total_orders,
total_revenue,
avg_check,
NOW() AS created_at -- метка времени загрузки
FROM metrics;
*
ROW_NUMBER по order_id + сортировка по updated_at даёт последнюю версию заказа. Фильтр rn = 1 AND status = 'paid' применяется после дедупликации.Схема таблицы:
CREATE TABLE daily_sales_report (
report_date DATE PRIMARY KEY,
total_orders INT,
total_revenue DECIMAL(15,2),
avg_check DECIMAL(10,2),
created_at TIMESTAMP DEFAULT NOW()
);
PRIMARY KEY гарантирует одну строку на день. Типы DECIMAL защищают от ошибок округления. Шаги пайплайна:
✅
Extract → забираем orders за вчерашний день (инкрементально по дате);✅
Transform → дедупликация, фильтр paid, агрегаты (тот самый SQL);✅
Load → UPSERT (INSERT ... ON CONFLICT DO UPDATE) по report_date; ✅
Schedule → запуск в 09:00.* Важно помнить про идемпотентность: повторный запуск пайплайна не дублирует строки и не ломает метрики.
Data Quality проверки:
✅
total_orders > 0 и total_revenue >= 0;✅
report_date уникален (нет дублей дат в витрине). * Опционально: алерт, если выручка отклоняется >50% от предыдущего дня.
Понравилось решение? Больше таких задач решаем на курсе «Инженер данных» с моей менторской поддержкой — вы научитесь строить надёжные пайплайны для компаний и освоите необходимые инструменты для их создания. И самое главное — все задачи построены на реальных кейсах бизнеса!
⚙️ Записаться на курс: https://simulative.ru/data-engineer
📈 Симулейтив | 📱 ВК | 📱 YouTube | 📱 Канал о DS