Biểu thức bảng chung (CTE)

Xử lý dữ liệu trong Snowflake

Jake Roach

Field Data Engineer

Biểu thức bảng chung (CTE)

Common Table Expressions (CTE) tạm lưu kết quả của một truy vấn để dùng cho truy vấn khác

$$

  • CTE được khai báo ở đầu truy vấn
  • WITH <cte-name> AS ( <query> )
  • Tương tự truy vấn lồng
-- Truyền tên CTE,
-- rồi đến truy vấn trong ngoặc đơn
WITH <cte-name> AS (
    <query>
)


SELECT ... FROM <cte-name> ... ;
Xử lý dữ liệu trong Snowflake

Báo cáo về học viên có nguy cơ

WITH at_risk AS (
    SELECT
        student_id
        course_name,
        teacher_name,
        grade
    FROM student_courses
    WHERE grade < 70 AND is_required
)

SELECT students.student_name, at_risk.* FROM at_risk JOIN students ON at_risk.student_id = students.id;

$$

  • Kết quả tạm lưu trong at_risk
  • Chọn một tập con bản ghi
  • Truy vấn at_risk để tạo báo cáo

$$

$$

$$

Xử lý dữ liệu trong Snowflake

Báo cáo về học viên có nguy cơ

Hiển thị kết quả của CTE với tập con kết quả và báo cáo cuối cùng

Xử lý dữ liệu trong Snowflake

So sánh truy vấn lồng và CTE

SELECT
    month_num,
    AVG(differential) AS avg_differential
    MIN(differential) AS most_differential
FROM (

    SELECT
        month_num,
        windchill - temperature AS differential
    FROM weather
    WHERE 
        season = 'Winter' AND
        temperature < 32

)
GROUP BY month_num;
WITH daily_temperature_differential AS (
    SELECT
        month_num,
        windchill - temperature AS differential
    FROM weather
    WHERE 
        season = 'Winter' AND 
        temperature < 32
)

SELECT
    month_num,
    AVG(differential) AS avg_differential
    MIN(differential) AS most_differential
FROM daily_temperature_differential
GROUP BY month_num;
Xử lý dữ liệu trong Snowflake

Tìm chênh lệch nhiệt độ

WITH daily_temperature_differential AS (
    SELECT
        month_num,
        windchill - temperature AS differential
    FROM weather
    WHERE 
        season = 'Winter' AND 
        temperature < 32
)

SELECT month_num, AVG(differential) AS avg_differential MIN(differential) AS most_differential FROM daily_temperature_differential GROUP BY month_num;
          | month_num | differential |
          | --------- | ------------ |
          |     12    |      -12     |
          |     1     |      -3      |
          |     1     |       0      |
          |     2     |      -7      |

Cách triển khai tự nhiên hơn so với truy vấn lồng.

| month_num | avg_differential | most_differential |
| --------- | ---------------- | ----------------- |
|     12    |       -5.77      |        -14        |
|     1     |       -1.91      |        -8         |
|     2     |       -8.13      |        -22        |
Xử lý dữ liệu trong Snowflake

Hãy thực hành!

Xử lý dữ liệu trong Snowflake

Preparing Video For Download...