У цій лекції розглянемо цікавий практичний приклад.
Середній чек — це метрика, яка показує, скільки в середньому витрачає клієнт за одну покупку. Це одна з ключових бізнес-метрик, яка дозволяє:
- аналізувати зміну купівельної спроможності,
- виявляти тренди у продажах,
- оцінювати ефективність маркетингових кампаній.
Постановка задачі
Уяви, що у нас є база даних з таблицею orders, де зберігаються замовлення. Наша ціль:
- Порахувати середній чек для замовлень, зроблених за останні три місяці.
- Автоматизувати цей розрахунок за допомогою процедури.
- Зберегти результат в окрему таблицю для подальшого аналізу.
Розширюємо нашу базу даних: структура таблиці orders
Для початку давай переконаємось, що у нас є таблиця з потрібними даними. Ось як може виглядати структура таблиці orders:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
total_amount NUMERIC(10, 2) NOT NULL
);
- order_id — унікальний ідентифікатор замовлення.
- customer_id — клієнт, який зробив замовлення.
- order_date — дата, коли було оформлено замовлення.
- total_amount — загальна сума замовлення.
Для прикладу додамо кілька записів у таблицю, щоб було з чим працювати:
INSERT INTO orders (customer_id, order_date, total_amount)
VALUES
(1, '2023-07-15', 100.00),
(2, '2023-08-10', 200.50),
(3, '2023-09-01', 150.75),
(1, '2023-09-20', 300.00),
(4, '2023-09-25', 250.00),
(5, '2023-10-05', 450.00);
Розрахунок середнього чека вручну
Перш ніж автоматизувати процес, давай напишемо базовий запит, який порахує середній чек за останні 3 місяці. Ми будемо використовувати поточну дату (CURRENT_DATE) і функцію AVG() для розрахунку середнього.
SELECT ROUND(AVG(total_amount), 2) AS avg_check
FROM orders
WHERE order_date >= (CURRENT_DATE - INTERVAL '3 months');
Що тут відбувається:
AVG(total_amount)— агрегатна функція, яка рахує середнє значенняtotal_amount.CURRENT_DATE - INTERVAL '3 months'— визначає замовлення, зроблені за останні три місяці.ROUND(..., 2)— округлює результат до двох знаків після коми.
Результат запиту буде виглядати приблизно так:
| avg_check |
|---|
| 270.25 |
Автоматизація за допомогою процедури
Тепер наша задача — створити процедуру, яка буде виконувати цей розрахунок автоматично, а результат логувати в окремій таблиці. Для початку створимо таблицю для зберігання логів аналітики.
Створення таблиці log_analytics
CREATE TABLE log_analytics (
log_id SERIAL PRIMARY KEY,
log_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
metric_name VARCHAR(50),
metric_value NUMERIC(10, 2)
);
- log_date — дата і час запису.
- metric_name — назва метрики (у нашому випадку "averagecheck_3_months").
- metric_value — пораховане значення метрики.
Створення процедури
Тепер напишемо процедуру, яка:
- Рахує середній чек за останні три місяці.
- Зберігає результат у таблицю
log_analytics.
CREATE OR REPLACE FUNCTION calculate_average_check()
RETURNS VOID AS $$
DECLARE
avg_check NUMERIC(10, 2);
BEGIN
-- Крок 1: Розрахунок середнього чека
SELECT ROUND(AVG(total_amount), 2)
INTO avg_check
FROM orders
WHERE order_date >= (CURRENT_DATE - INTERVAL '3 months');
-- Крок 2: Логування результату
INSERT INTO log_analytics (metric_name, metric_value)
VALUES ('average_check_3_months', avg_check);
-- Вивід інформації для відладки (опціонально)
RAISE NOTICE 'Середній чек: %', avg_check;
END;
$$ LANGUAGE plpgsql;
Тепер ти можеш викликати цю функцію, і вона автоматично запише результат у таблицю log_analytics:
SELECT calculate_average_check();
Автоматизація за допомогою планувальника задач
У минулій лекції ми вже встановили планувальник задач. Якщо ти працюєш у Linux — це було розширення pg_cron; якщо використовуєш Windows або macOS — ти, ймовірно, налаштував запуск через системний планувальник (cron або Task Scheduler). Тепер, коли все готово, давай підключимо нашу процедуру до розкладу.
Якщо ти на Linux і використовуєш pg_cron переконайся, що це розширення активовано в потрібній базі даних:
CREATE EXTENSION IF NOT EXISTS pg_cron;
(Нагадуємо: встановлення самого pg_cron і налаштування параметра shared_preload_libraries вже були розглянуті на попередньому занятті.)
Тепер можна запланувати виконання нашої функції calculate_average_check() — наприклад, кожного дня опівночі:
SELECT cron.schedule(
'daily_avg_check',
'0 0 * * *',
$$ SELECT calculate_average_check(); $$
);
Пояснення:
'daily_avg_check'— ім'я задачі;'0 0 * * *'— cron-вираз для запуску о 00:00 щодня;- команда всередині
$$— SQL, який буде виконано.
Якщо ти на Windows або macOS, pg_cron у цих системах не працює (у Windows — зовсім, у macOS — вимагає ручної збірки). Але ти вже налаштував системний планувальник — залишилось тільки підключити SQL-файл.
Створи файл із запитом:
echo "SELECT calculate_average_check();" > /path/to/script.sqlВикористовуй
psqlдля виконання файлу за розкладом:- У Linux/macOS:
(додається через0 0 * * * psql -h localhost -U postgres -d your_database -f /path/to/script.sqlcrontab -e) - У Windows Task Scheduler:
- Вкажи шлях до
psql.exe. - В аргументах:
-U postgres -d your_database -f "C:\path\to\script.sql"
- Вкажи шлях до
- У Linux/macOS:
Таким чином, незалежно від твоєї системи, процедура буде виконуватись автоматично і регулярно фіксувати середній чек у таблиці log_analytics. Якщо ти не впевнений, який спосіб використовуєш, повернись до попередньої лекції — там описані і встановлення, і налаштування планувальника для різних платформ.
Перевірка і аналіз результатів
Подивимось, що у нас вийшло. Запросимо дані з таблиці log_analytics:
SELECT * FROM log_analytics ORDER BY log_date DESC;
Приклад результату:
| log_id | log_date | metric_name | metric_value |
|---|---|---|---|
| 1 | 2023-10-10 00:00:00 | averagecheck3_months | 270.25 |
Тепер у нас є лог усіх розрахунків середнього чека! Ці дані можна використовувати для генерації звітів або аналізу змін метрики з часом.
Часті помилки і як їх уникнути
Робота з аналітичними процедурами по розрахунку середнього чека може бути пов'язана з кількома типовими помилками.
Одна з них — забути врахувати порожні результати. Якщо за останні три місяці не було замовлень, функція AVG() поверне NULL, що може призвести до проблем при логуванні. Щоб уникнути цього, можна використати COALESCE():
SELECT ROUND(COALESCE(AVG(total_amount), 0), 2) AS avg_check
Ще одна помилка — некоректні дані в таблиці orders. Наприклад, від'ємні суми замовлень або невалідні дати. Рекомендується регулярно перевіряти дані або додавати обмеження на рівні бази даних (наприклад, CHECK (total_amount > 0)).
Вітаю, тепер у тебе є повноцінна процедура, яка автоматично рахує середній чек за останні три місяці і зберігає результат для подальшого аналізу. Це лише один із багатьох прикладів того, як PostgreSQL і PL/pgSQL можуть допомогти автоматизувати аналітичні задачі. У наступній лекції ми продовжимо розбирати більш складні аналітичні сценарії. До зустрічі!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ