Sestavování složitých výpočtů

Reporting in SQL

Tyler Pernes

Learning & Development Consultant

Přístupy

  1. Okenní funkce
  2. Vrstvené výpočty
Reporting in SQL

Okenní funkce

  • Odkazuje na ostatní řádky v tabulce.
Reporting in SQL

Okenní funkce

  • Odkazuje na ostatní řádky v tabulce.

Reporting in SQL

Okenní funkce

  • Odkazuje na ostatní řádky v tabulce.

Reporting in SQL

Syntaxe okenních funkcí

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

Reporting in SQL

Syntaxe okenních funkcí

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

Reporting in SQL

Syntaxe okenních funkcí

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

  • PARTITION BY = rozsah výpočtu
  • ORDER BY = pořadí řádků při výpočtu
Reporting in SQL

Příklady okenních funkcí

Celkový počet bronzových medailí

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           |
+-------------+-------------+---------------+
Reporting in SQL

Příklady okenních funkcí

Bronzové medaile podle země

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             |
+-------------+-------------+---------------+
Reporting in SQL

Typy okenních funkcí

  • SUM()
  • AVG()
  • MIN()
  • MAX()
Reporting in SQL

Typy okenních funkcí

  • LAG() a LEAD()

Reporting in SQL

Typy okenních funkcí

  • LAG() a LEAD()

Reporting in SQL

Typy okenních funkcí

  • ROW_NUMBER() a RANK()

Reporting in SQL

Okenní funkce nad agregací

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            |
+----------+-------------+---------------+
Reporting in SQL

Okenní funkce nad agregací

Výsledný dotaz

SELECT
    team_id,
    SUM(points) AS team_points,
    SUM(SUM(points)) OVER () AS league_points
FROM original_table
GROUP BY team_id;
Reporting in SQL

Okenní funkce nad agregací

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.
Reporting in SQL

Vrstvené výpočty

  • Agregace existující agregace
  • Využívá poddotaz
Reporting in SQL

Příklad vrstveného výpočtu

Krok 1: Celkový počet bronzových medailí podle země

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

Krok 2: Převod na poddotaz a výběr maxima

SELECT MAX(bronze_medals)
FROM
  (SELECT country_id, SUM(bronze) as bronze_medals
  FROM summer_games
  GROUP BY country_id) AS subquery;
Reporting in SQL

Plánování složitých výpočtů

Reporting in SQL

Plánování složitých výpočtů

  • Řazení pro okenní funkci?
  • Dvě agregace s vrstveným výpočtem?
Reporting in SQL

Lass uns üben!

Reporting in SQL

Preparing Video For Download...