Основи баз даних
VTFK • 2025
Лекція 17: MLOps & Databases
Фокус: розрахунки по групам та послідовностях
Розбиває результати на групи за значенням колонок, дозволяє агрегатні функції на групах.
Аналогія: Як розділити рахунок на сумах по гостях
Групування і агрегація
SELECT column1, COUNT(*), SUM(column2)
FROM table
GROUP BY column1;
Продажи по країнах
SELECT
country,
COUNT(*) AS order_count,
SUM(amount) AS total_revenue,
AVG(amount) AS avg_order
FROM orders
GROUP BY country
ORDER BY total_revenue DESC;
Країни з 10+ замовленнями
SELECT
country,
COUNT(*) AS order_count,
SUM(amount) AS total
FROM orders
GROUP BY country
HAVING COUNT(*) >= 10 -- фільтр груп
ORDER BY order_count DESC;
| Аспект | WHERE | HAVING |
|---|---|---|
| Застосовується | Рядки | Групи |
| Коли | До GROUP BY | Після GROUP BY |
| Функції | Базові | Агрегатні |
| Приклад | age > 18 | COUNT(*) > 10 |
Функції які працюють на наборах рядків (вікна), можуть обчислювати без групування.
Аналогія: Як слайдерне вікно через дані, обчислює на кожний рядок у контексті
Ранжирование рядків
SELECT
user_id,
amount,
ROW_NUMBER() OVER (ORDER BY amount DESC) AS rank
FROM orders;
-- Результат:
-- user_id | amount | rank
-- 1 | 1000 | 1
-- 2 | 950 | 2
-- 3 | 900 | 3
Попередній та наступний рядок
SELECT
user_id,
created_at,
amount,
LAG(amount) OVER (ORDER BY created_at) AS prev_amount,
LEAD(amount) OVER (ORDER BY created_at) AS next_amount
FROM orders;
-- Результат: видимо тренд замовлень
Поточна сума
SELECT
user_id,
amount,
SUM(amount) OVER (ORDER BY created_at) AS cumulative_sum
FROM orders
ORDER BY created_at;
GROUP BY колапсує до груп, вікна зберігають кожний рядок.
Всі SELECT колонки мають бути у GROUP BY або агрегати
SELECT country, user_id, COUNT(*)
FROM orders
GROUP BY country; -- ПОМИЛКА: user_id не у GROUP BY
БД не знає яке user_id показувати (багато в групі)
SELECT country, COUNT(DISTINCT user_id) AS users
FROM orders
GROUP BY country;
Агрегат DISTINCT user_id коректний
Від простого к складному
Базова агрегація
Фільтрування груп
ROW_NUMBER, RANK
Складні вікна
GROUP BY + HAVING + Window
SELECT
EXTRACT(MONTH FROM created_at) AS month,
COUNT(*) AS orders,
SUM(amount) AS revenue,
ROW_NUMBER() OVER (ORDER BY SUM(amount) DESC) AS rank,
LAG(SUM(amount)) OVER (ORDER BY created_at) AS prev_month_revenue
FROM orders
GROUP BY month
HAVING COUNT(*) > 5
ORDER BY month;
Далі — MongoDB агрегація
Лекція 19: MongoDB Aggregation
Дякую за увагу! 💾