ЛЕКЦІЯ 18

GROUP BY, HAVING та віконні функції

Основи баз даних

VTFK • 2025

Що вже вивчили

Лекція 17: MLOps & Databases

  • ML pipeline з БД
  • Feature engineering
  • Вектори та пошук

План лекції

  • GROUP BY для агрегації
  • HAVING для фільтрування груп
  • Віконні функції (ROW_NUMBER, LAG/LEAD)
  • Практика аналізу

Фокус: розрахунки по групам та послідовностях

GROUP BY - групування даних

GROUP BY

Grouping

Розбиває результати на групи за значенням колонок, дозволяє агрегатні функції на групах.

Аналогія: Як розділити рахунок на сумах по гостях

GROUP BY логіка

Групування і агрегація

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR Raw[Raw data
100 рядків] --> Group[GROUP BY country] Group --> USA[USA: 30 рядків] Group --> UK[UK: 40 рядків] Group --> DE[Germany: 30 рядків] USA --> Agg[COUNT/SUM/AVG] UK --> Agg DE --> Agg Agg --> Result[3 рядки результату]

Базовий GROUP BY

SELECT column1, COUNT(*), SUM(column2) FROM table GROUP BY column1;
GROUP BY — список колонок для групування
SELECT — групова колонка + агрегати
COUNT/SUM — функції по групі
GROUP BY — список колонок для групування
SELECT — групова колонка + агрегати
COUNT/SUM — функції по групі
GROUP BY — список колонок для групування
SELECT — групова колонка + агрегати
COUNT/SUM — функції по групі

GROUP BY приклад

Продажи по країнах

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;

HAVING - фільтрування груп

HAVING приклад

Країни з 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 vs HAVING

Аспект WHERE HAVING
Застосовується Рядки Групи
Коли До GROUP BY Після GROUP BY
Функції Базові Агрегатні
Приклад age > 18 COUNT(*) > 10

Віконні функції

Window Functions

Функції які працюють на наборах рядків (вікна), можуть обчислювати без групування.

Аналогія: Як слайдерне вікно через дані, обчислює на кожний рядок у контексті

Типи віконних функцій

ROW_NUMBER - нумерація

Ранжирование рядків

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

LAG/LEAD - порівняння з сусідами

Попередній та наступний рядок

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;

-- Результат: видимо тренд замовлень

SUM OVER - накопичування

Поточна сума

SELECT 
  user_id,
  amount,
  SUM(amount) OVER (ORDER BY created_at) AS cumulative_sum
FROM orders
ORDER BY created_at;

Міні-вікторина

Яка різниця GROUP BY та віконних функцій?

  • GROUP BY = групи, вікно = кожний рядок контексті
  • Вони робять одне й те саме
  • Вікна швидше
✅ Правильна відповідь: GROUP BY = групи, вікно = кожний рядок контексті
💡 Пояснення:

GROUP BY колапсує до груп, вікна зберігають кожний рядок.

Помилка: колонка у 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 коректний

История GROUP BY та вікон

Від простого к складному

1974

GROUP BY

Базова агрегація

1992

HAVING

Фільтрування груп

2003

Window functions

ROW_NUMBER, RANK

2025

Advanced analytics

Складні вікна

Best practices GROUP BY/HAVING

Міні ТЗ: аналіз продажів по місяцям

Комплексна аналіз

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;

Підсумки

  • GROUP BY агрегує дані по групах
  • HAVING фільтрує після групування
  • Вікна обчислюють по послідовностях рядків

Далі — MongoDB агрегація

Домашнє завдання

Наступна лекція:

Лекція 19: MongoDB Aggregation

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій