Xây dựng phép tính phức tạp

Lập báo cáo trong SQL

Tyler Pernes

Learning & Development Consultant

Cách tiếp cận

  1. Hàm cửa sổ
  2. Phép tính phân lớp
Lập báo cáo trong SQL

Hàm cửa sổ

  • Tham chiếu đến các dòng khác trong bảng.
Lập báo cáo trong SQL

Hàm cửa sổ

  • Tham chiếu đến các dòng khác trong bảng.

Lập báo cáo trong SQL

Hàm cửa sổ

  • Tham chiếu đến các dòng khác trong bảng.

Lập báo cáo trong SQL

Cú pháp hàm cửa sổ

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

Lập báo cáo trong SQL

Cú pháp hàm cửa sổ

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

Lập báo cáo trong SQL

Cú pháp hàm cửa sổ

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

  • PARTITION BY = phạm vi tính toán
  • ORDER BY = thứ tự dòng khi chạy phép tính
Lập báo cáo trong SQL

Ví dụ về hàm cửa sổ

Tổng huy chương đồng

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           |
+-------------+-------------+---------------+
Lập báo cáo trong SQL

Ví dụ về hàm cửa sổ

Huy chương đồng theo quốc gia

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             |
+-------------+-------------+---------------+
Lập báo cáo trong SQL

Các loại hàm cửa sổ

  • SUM()
  • AVG()
  • MIN()
  • MAX()
Lập báo cáo trong SQL

Các loại hàm cửa sổ

  • LAG()LEAD()

Lập báo cáo trong SQL

Các loại hàm cửa sổ

  • LAG()LEAD()

Lập báo cáo trong SQL

Các loại hàm cửa sổ

  • ROW_NUMBER()RANK()

Lập báo cáo trong SQL

Hàm cửa sổ trên phép tổng hợp

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            |
+----------+-------------+---------------+
Lập báo cáo trong SQL

Hàm cửa sổ trên phép tổng hợp

Truy vấn cuối

SELECT
    team_id,
    SUM(points) AS team_points,
    SUM(SUM(points)) OVER () AS league_points
FROM original_table
GROUP BY team_id;
Lập báo cáo trong SQL

Hàm cửa sổ trên phép tổng hợp

SELECT
    team_id,
    SUM(points) AS team_points,
    SUM(points) OVER () AS league_points
FROM original_table
GROUP BY team_id;
ERROR: points phải là một phép tổng hợp hoặc xuất hiện trong mệnh đề GROUP BY.
Lập báo cáo trong SQL

Phép tính phân lớp

  • Tổng hợp trên một tổng hợp có sẵn
  • Dùng truy vấn con
Lập báo cáo trong SQL

Ví dụ phép tính phân lớp

Bước 1: Tổng huy chương đồng theo quốc gia

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

Bước 2: Chuyển thành truy vấn con và lấy giá trị lớn nhất

SELECT MAX(bronze_medals)
FROM
  (SELECT country_id, SUM(bronze) as bronze_medals
  FROM summer_games
  GROUP BY country_id) AS subquery;
Lập báo cáo trong SQL

Lập kế hoạch phép tính phức tạp

Lập báo cáo trong SQL

Lập kế hoạch phép tính phức tạp

  • Có cần sắp xếp cho hàm cửa sổ?
  • Hai phép tổng hợp với tính toán phân lớp?
Lập báo cáo trong SQL

Let's practice!

Lập báo cáo trong SQL

Preparing Video For Download...