Построение сложных вычислений

Отчётность в SQL

Tyler Pernes

Learning & Development Consultant

Подходы

  1. Оконные функции
  2. Многоуровневые вычисления
Отчётность в SQL

Оконные функции

  • Обращается к другим строкам таблицы.
Отчётность в SQL

Оконные функции

  • Обращается к другим строкам таблицы.

Отчётность в SQL

Оконные функции

  • Обращается к другим строкам таблицы.

Отчётность в SQL

Синтаксис оконных функций

SUM(value) OVER (PARTITION BY field ORDER BY field)

Отчётность в SQL

Синтаксис оконных функций

SUM(value) OVER (PARTITION BY field ORDER BY field)

Отчётность в SQL

Синтаксис оконных функций

SUM(value) OVER (PARTITION BY field ORDER BY field)

  • PARTITION BY = диапазон вычисления
  • ORDER BY = порядок строк при вычислении
Отчётность в SQL

Примеры оконных функций

Всего бронзовых медалей

SELECT 
    country_id, 
    athlete_id, 
    SUM(bronze) OVER () AS total_bronze
FROM summer_games;
+-------------+-------------+---------------+
| country_id  | athlete_id  | total_bronze  |
|-------------|-------------|---------------|
| 11          | 77505       | 141           |
| 11          | 11673       | 141           |
| 14          | 85554       | 141           |
| 14          | 76433       | 141           |
+-------------+-------------+---------------+
Отчётность в SQL

Примеры оконных функций

Бронзовые медали по странам

SELECT 
    country_id, 
    athlete_id, 
    SUM(bronze) OVER (PARTITION BY country_id) AS total_bronze
FROM summer_games
+-------------+-------------+---------------+
| country_id  | athlete_id  | total_bronze  |
|-------------|-------------|---------------|
| 11          | 77505       | 12            |
| 11          | 11673       | 12            |
| 14          | 85554       | 5             |
| 14          | 76433       | 5             |
+-------------+-------------+---------------+
Отчётность в SQL

Виды оконных функций

  • SUM()
  • AVG()
  • MIN()
  • MAX()
Отчётность в SQL

Виды оконных функций

  • LAG() и LEAD()

Отчётность в SQL

Виды оконных функций

  • LAG() и LEAD()

Отчётность в SQL

Виды оконных функций

  • ROW_NUMBER() и RANK()

Отчётность в SQL

Оконная функция над агрегацией

original_table
+----------+-----------+---------+ 
| team_id  | player_id | points  |
|----------|-----------|---------|    
| 1        | 4123      | 3       |
| 1        | 5231      | 6       |
| 2        | 8271      | 5       |
+----------+-----------+---------+
desired_report
+----------+-------------+---------------+ 
| team_id  | team_points | league_points |
|----------|-------------|---------------|    
| 1        | 9           | 43            |
| 2        | 12          | 43            |
| 3        | 22          | 43            |
+----------+-------------+---------------+
Отчётность в SQL

Оконная функция над агрегацией

Итоговый запрос

SELECT
    team_id,
    SUM(points) AS team_points,
    SUM(SUM(points)) OVER () AS league_points
FROM original_table
GROUP BY team_id;
Отчётность в SQL

Оконная функция над агрегацией

SELECT
    team_id,
    SUM(points) AS team_points,
    SUM(points) OVER () AS league_points
FROM original_table
GROUP BY team_id;
ERROR: points must be an aggregation or appear in a GROUP BY statement.
Отчётность в SQL

Многоуровневые вычисления

  • Агрегирование существующей агрегации
  • Использует подзапрос
Отчётность в SQL

Пример многоуровневых вычислений

Шаг 1: Всего бронзовых медалей по странам

SELECT country_id, SUM(bronze) as bronze_medals
FROM summer_games
GROUP BY country_id;

Шаг 2: Преобразуем в подзапрос и берём максимум

SELECT MAX(bronze_medals)
FROM
  (SELECT country_id, SUM(bronze) as bronze_medals
  FROM summer_games
  GROUP BY country_id) AS subquery;
Отчётность в SQL

Планирование сложных вычислений

Отчётность в SQL

Планирование сложных вычислений

  • Нужен ли порядок для оконной функции?
  • Две агрегации с многоуровневым вычислением?
Отчётность в SQL

Давайте потренируемся!

Отчётность в SQL

Preparing Video For Download...