Appearance
🏆 Tiêu chuẩn Buổi 6: SQL — Window Function & Data Warehouse
Các tiêu chuẩn và framework quốc tế cần nắm cho Window Functions, Data Warehouse Design và Dimensional Modeling
Tổng quan
Buổi 6 đưa bạn từ SQL cơ bản (SELECT, JOIN, GROUP BY) sang SQL phân tích chuyên nghiệp — Window Functions, Running Total, MoM Growth — và từ database giao dịch sang Data Warehouse với Star Schema. Đây là bước chuyển then chốt: từ "viết query lấy số liệu" sang "viết query phân tích dữ liệu như một chuyên gia".
Window Functions không phải "syntax ngẫu nhiên ai đó nghĩ ra". Chúng là một phần của chuẩn ANSI SQL (được bổ sung từ SQL:1999 và mở rộng qua SQL:2003, SQL:2011) — nghĩa là cú pháp ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) chạy giống nhau trên PostgreSQL, BigQuery, SQL Server, Snowflake... Data Warehouse cũng có framework thiết kế riêng — Kimball Dimensional Modeling — chuẩn "de facto" cho star schema mà 80%+ doanh nghiệp sử dụng. Và DAMA DMBOK cung cấp khung quản trị dữ liệu tổng thể, bao gồm cả data warehousing.
Các tiêu chuẩn trong buổi này cung cấp:
- Chuẩn Window Functions: ANSI SQL:2003+ định nghĩa cú pháp OVER, PARTITION BY, ROWS/RANGE — portable giữa các hệ thống
- Framework thiết kế Data Warehouse: Kimball Dimensional Modeling — star schema, fact vs dimension, slowly changing dimensions
- Khung quản trị dữ liệu: DAMA DMBOK — data warehousing & BI trong bức tranh tổng thể data management
- Tư duy có hệ thống: Hiểu tiêu chuẩn giúp bạn viết SQL nâng cao "có nguyên tắc", thiết kế DW "đúng phương pháp"
Theo khảo sát DataLemur (2025), 70%+ câu hỏi SQL trong phỏng vấn Data Analyst yêu cầu Window Functions. Theo Gartner, 85% doanh nghiệp lớn sử dụng Data Warehouse hoặc Data Lakehouse cho analytics. Nắm vững tiêu chuẩn giúp bạn không chỉ viết query đúng, mà còn giao tiếp chuyên nghiệp với Data Engineer, DBA, và toàn bộ data team.
📋 Danh sách tiêu chuẩn liên quan
| # | Tiêu chuẩn | Tổ chức / Tác giả | Áp dụng cho Buổi 6 |
|---|---|---|---|
| 1 | ANSI SQL Window Functions (SQL:2003+) | ANSI / ISO (ISO/IEC 9075) | Chuẩn Window Functions — ROW_NUMBER, RANK, LAG, LEAD, SUM OVER, frame clause |
| 2 | Kimball Dimensional Modeling | Ralph Kimball / Kimball Group | Star schema, fact table, dimension table, slowly changing dimensions (SCD) |
| 3 | DAMA DMBOK — Data Warehousing & BI | DAMA International | Khung quản trị Data Warehouse, Data Integration, BI trong enterprise |
1️⃣ ANSI SQL Window Functions (ISO/IEC 9075 — SQL:2003+)
Giới thiệu
Window Functions (hàm cửa sổ) được chính thức đưa vào chuẩn ANSI SQL:1999 với khái niệm cơ bản, sau đó mở rộng đáng kể trong SQL:2003 với đầy đủ cú pháp OVER, PARTITION BY, ORDER BY, và frame clause (ROWS BETWEEN). Các phiên bản sau — SQL:2008, SQL:2011 — tiếp tục bổ sung thêm hàm và tùy chọn.
Tại sao Window Functions lại được đưa vào chuẩn quốc tế? Vì GROUP BY có hạn chế cơ bản: khi gom nhóm, bạn mất chi tiết từng dòng. Rất nhiều bài toán phân tích thực tế đòi hỏi vừa giữ chi tiết dòng, vừa có giá trị tổng hợp — xếp hạng, tích lũy, so sánh với dòng trước/sau. Trước SQL:2003, phải dùng self-join hoặc subquery phức tạp, chậm, và khó đọc. Window Functions giải quyết triệt để vấn đề này bằng một cú pháp chuẩn, tối ưu, portable.
Trong thực tế 2025–2026, tất cả major database đều hỗ trợ Window Functions: PostgreSQL (đầy đủ nhất), MySQL 8.0+, SQL Server, Oracle, SQLite 3.25+, Google BigQuery, Amazon Redshift, Snowflake, Databricks SQL. Nắm vững ANSI Window Functions nghĩa là bạn viết query chạy được trên mọi nền tảng.
Nội dung chính
Phân loại Window Functions theo ANSI SQL
| Nhóm | Hàm | Chuẩn ANSI | Mô tả |
|---|---|---|---|
| Ranking | ROW_NUMBER() | SQL:2003 | Số thứ tự duy nhất mỗi dòng trong window |
RANK() | SQL:2003 | Xếp hạng — bỏ qua thứ hạng khi có ties | |
DENSE_RANK() | SQL:2003 | Xếp hạng — không bỏ qua thứ hạng khi có ties | |
NTILE(n) | SQL:2003 | Chia đều dữ liệu thành n nhóm (quartile, decile...) | |
| Offset | LAG(expr, offset, default) | SQL:2011 | Truy cập giá trị dòng trước dòng hiện tại |
LEAD(expr, offset, default) | SQL:2011 | Truy cập giá trị dòng sau dòng hiện tại | |
FIRST_VALUE(expr) | SQL:2003 | Giá trị đầu tiên trong window | |
LAST_VALUE(expr) | SQL:2003 | Giá trị cuối cùng trong window | |
NTH_VALUE(expr, n) | SQL:2011 | Giá trị thứ n trong window | |
| Aggregate | SUM() OVER | SQL:2003 | Tổng cộng trên window — running total |
AVG() OVER | SQL:2003 | Trung bình trên window — moving average | |
COUNT() OVER | SQL:2003 | Đếm trên window | |
MIN() OVER, MAX() OVER | SQL:2003 | Min/Max trên window |
Cú pháp OVER clause (ANSI Standard)
sql
-- Cú pháp đầy đủ theo ANSI SQL:2003+
function_name(expression) OVER (
[PARTITION BY partition_expression, ...] -- Chia thành các nhóm (window)
[ORDER BY sort_expression [ASC|DESC], ...] -- Sắp xếp trong mỗi nhóm
[frame_clause] -- Khung cửa sổ
)
-- Frame clause syntax (ANSI SQL:2003)
{ ROWS | RANGE } BETWEEN frame_start AND frame_end
-- frame_start / frame_end có thể là:
-- UNBOUNDED PRECEDING -- Từ đầu partition
-- n PRECEDING -- n dòng trước
-- CURRENT ROW -- Dòng hiện tại
-- n FOLLOWING -- n dòng sau
-- UNBOUNDED FOLLOWING -- Đến cuối partitionDefault frame behavior (quan trọng!)
| Trường hợp | Default frame | Giải thích |
|---|---|---|
OVER () — không có ORDER BY | Toàn bộ partition | SUM(x) OVER () = tổng toàn bộ |
OVER (ORDER BY col) — có ORDER BY | RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | SUM(x) OVER (ORDER BY date) = running total |
| Explicit frame | Theo frame bạn chỉ định | ROWS BETWEEN 6 PRECEDING AND CURRENT ROW = 7 dòng gần nhất |
⚠️ ANSI trap: Khi có
ORDER BYtrongOVER, default frame làRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW— nghĩa làSUM() OVER (ORDER BY date)tự động thành running total, không phải grand total. Nhiều người không biết điều này và viết query sai kết quả.
ROWS vs RANGE (ANSI distinction)
| Keyword | Hoạt động theo | Ví dụ khi có tied values |
|---|---|---|
ROWS | Vị trí vật lý (physical rows) | Mỗi dòng tính riêng — deterministic |
RANGE | Giá trị logic (logical range) | Dòng có cùng giá trị ORDER BY → tính chung |
sql
-- ROWS: tính chính xác dòng vật lý → kết quả luôn deterministic
SUM(revenue) OVER (ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-- RANGE: nếu 2 đơn cùng ngày → tính chung → running total có thể "nhảy"
SUM(revenue) OVER (ORDER BY order_date RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)💡 Best practice ANSI: Luôn dùng
ROWSkhi cần running total chính xác. DùngRANGEkhi muốn tất cả dòng cùng giá trị được xử lý giống nhau.
Áp dụng cho Data Analyst
| Tình huống DA | ANSI Window Function áp dụng |
|---|---|
| Top N sản phẩm trong mỗi category | ROW_NUMBER() OVER (PARTITION BY category ORDER BY revenue DESC) → lọc WHERE row_num <= N |
| So sánh doanh thu MoM | LAG(revenue, 1) OVER (ORDER BY month) → tính % tăng trưởng so tháng trước |
| Doanh thu tích lũy theo ngày | SUM(revenue) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) |
| Moving average 7 ngày | AVG(dau) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) |
| Tỷ trọng % trong tổng | revenue * 100.0 / SUM(revenue) OVER (PARTITION BY category) |
| Phân nhóm khách hàng (quartile) | NTILE(4) OVER (ORDER BY total_spent DESC) → chia 4 nhóm theo chi tiêu |
| Đơn hàng đầu tiên mỗi khách | FIRST_VALUE(order_date) OVER (PARTITION BY customer_id ORDER BY order_date) |
Ví dụ thực tế
Tình huống: Data Analyst cần xếp hạng sản phẩm theo doanh thu trong mỗi danh mục, và tính % đóng góp.
❌ Không dùng Window Function (phải dùng subquery phức tạp):
sql
-- Phải self-join hoặc subquery lồng nhau — dài, khó đọc, chậm
SELECT
p.category,
p.product_name,
p.revenue,
(SELECT COUNT(*) + 1
FROM product_sales p2
WHERE p2.category = p.category AND p2.revenue > p.revenue
) AS rank_pos,
ROUND(p.revenue * 100.0 / cat.cat_total, 1) AS pct_of_category
FROM product_sales p
JOIN (
SELECT category, SUM(revenue) AS cat_total
FROM product_sales
GROUP BY category
) cat ON p.category = cat.category
ORDER BY p.category, p.revenue DESC;✅ Dùng Window Function chuẩn ANSI SQL:2003:
sql
-- Clean, readable, performant — ANSI SQL:2003 standard
SELECT
category,
product_name,
revenue,
DENSE_RANK() OVER (PARTITION BY category ORDER BY revenue DESC) AS rank_pos,
ROUND(
revenue * 100.0 / SUM(revenue) OVER (PARTITION BY category), 1
) AS pct_of_category
FROM product_sales
ORDER BY category, revenue DESC;Sự khác biệt:
- Window Function: 1 query, rõ ràng, engine tối ưu — chạy nhanh hơn trên dữ liệu lớn
- Subquery approach: 2 lần scan bảng, code dài, khó maintain
- Khi thêm yêu cầu (ví dụ thêm running total) — Window Function chỉ cần thêm 1 dòng, subquery phải viết thêm 1 block lớn
2️⃣ Kimball Dimensional Modeling
Giới thiệu
Kimball Dimensional Modeling là phương pháp thiết kế Data Warehouse do Ralph Kimball — "cha đẻ" của dimensional modeling — phát triển từ thập niên 1990. Cuốn sách kinh điển "The Data Warehouse Toolkit" (xuất bản lần đầu 1996, tái bản lần 3 năm 2013) là "kinh thánh" của data warehousing, được sử dụng bởi hàng ngàn doanh nghiệp trên toàn cầu.
Tại sao Kimball quan trọng? Vì database giao dịch (OLTP) được thiết kế cho tốc độ ghi (INSERT/UPDATE nhanh), với schema normalized (nhiều bảng nhỏ, ít dư thừa) — không phù hợp cho phân tích (query phức tạp, JOIN nhiều bảng, scan hàng triệu dòng). Kimball Dimensional Modeling thiết kế schema tối ưu cho tốc độ đọc và dễ hiểu — giúp Data Analyst query nhanh hơn, ít JOIN hơn, và output trực quan hơn.
Phương pháp Kimball tổ chức dữ liệu thành Star Schema — với Fact Table (bảng sự kiện chứa metrics/measures) ở trung tâm, bao quanh bởi Dimension Tables (bảng chiều chứa context mô tả). Thay vì 20+ bảng normalized với 10 lần JOIN, bạn chỉ cần 1 fact table JOIN với 4–5 dimension tables — query đơn giản, kết quả nhanh.
Trong hệ sinh thái modern data (BigQuery, Snowflake, Databricks, dbt), Kimball Dimensional Modeling vẫn là phương pháp phổ biến nhất — dù có thêm các biến thể mới như Data Vault, One Big Table. 80%+ Data Warehouse trên thế giới dùng star schema.
Nội dung chính
Bốn bước thiết kế Dimensional Model (Kimball's 4-Step Process)
| Bước | English | Mô tả | Output |
|---|---|---|---|
| 1 | Select the business process | Chọn quy trình kinh doanh cần phân tích | "Phân tích đơn hàng e-commerce" |
| 2 | Declare the grain | Xác định mức chi tiết cao nhất — 1 dòng trong fact table là gì? | "1 dòng = 1 line item (1 sản phẩm trong 1 đơn hàng)" |
| 3 | Identify the dimensions | Xác định các chiều mô tả — ai, cái gì, ở đâu, khi nào? | dim_customer, dim_product, dim_date, dim_store |
| 4 | Identify the facts | Xác định các số liệu đo lường — đo cái gì? | quantity, unit_price, discount_amount, line_total |
💡 Bước 2 (Declare the grain) là quan trọng nhất — sai grain thì toàn bộ thiết kế sai. Grain quá cao (1 dòng = 1 đơn hàng) thì mất chi tiết sản phẩm. Grain quá thấp (1 dòng = 1 click) thì bảng quá lớn, query chậm.
Fact Table — Bảng sự kiện
| Đặc điểm | Chi tiết |
|---|---|
| Chứa gì | Các metrics/measures (số liệu đo lường) + Foreign Keys tới dimension tables |
| Mỗi dòng | 1 sự kiện kinh doanh (1 giao dịch, 1 line item, 1 page view...) |
| Số dòng | Rất nhiều — hàng triệu → hàng tỷ |
| Số cột | Ít cột text, nhiều cột số (FK + measures) |
| Thay đổi | Chỉ INSERT (append-only) — không UPDATE/DELETE |
| Ví dụ | fact_sales, fact_orders, fact_page_views, fact_inventory_daily |
Ba loại fact (measures):
| Loại | English | Mô tả | Ví dụ |
|---|---|---|---|
| Additive | Additive Facts | Cộng được theo mọi dimension | revenue, quantity, discount |
| Semi-additive | Semi-additive | Cộng theo một số dimension, không phải tất cả | account_balance (cộng theo customer, KHÔNG cộng theo time) |
| Non-additive | Non-additive | Không thể cộng — chỉ tính AVG hoặc dùng nguyên giá trị | unit_price, ratio, percentage |
Dimension Table — Bảng chiều
| Đặc điểm | Chi tiết |
|---|---|
| Chứa gì | Thông tin mô tả (descriptive attributes) — ai, cái gì, ở đâu, khi nào |
| Mỗi dòng | 1 bản ghi duy nhất (1 khách hàng, 1 sản phẩm, 1 ngày...) |
| Số dòng | Ít hơn fact — hàng ngàn → hàng triệu |
| Số cột | Nhiều cột text (mô tả), ít cột số |
| Thay đổi | CÓ THỂ UPDATE (khách đổi địa chỉ, sản phẩm đổi giá...) → SCD |
| Ví dụ | dim_customer, dim_product, dim_date, dim_store, dim_promotion |
Dimension Table đặc biệt — dim_date:
sql
-- dim_date — bảng ngày tháng chi tiết (Date dimension)
-- Tạo sẵn cho 10–20 năm, chứa tất cả thuộc tính ngày
CREATE TABLE dim_date (
date_key INTEGER PRIMARY KEY, -- YYYYMMDD format
full_date DATE NOT NULL,
day_of_week INTEGER, -- 1 = Monday, 7 = Sunday
day_name VARCHAR(10), -- 'Monday', 'Tuesday'...
day_of_month INTEGER,
week_of_year INTEGER,
month_number INTEGER,
month_name VARCHAR(10), -- 'January', 'February'...
quarter INTEGER, -- 1, 2, 3, 4
year INTEGER,
is_weekend BOOLEAN,
is_holiday BOOLEAN,
fiscal_quarter INTEGER, -- Quý tài chính (có thể khác quý lịch)
fiscal_year INTEGER
);💡 Tại sao cần dim_date? Vì SQL
WHERE MONTH(order_date) = 1chạy chậm trên bảng lớn (full table scan). Khi JOIN vớidim_date, bạn chỉ cầnWHERE d.month_number = 1— index-friendly, nhanh hơn 10–100x.
Slowly Changing Dimensions (SCD)
| Loại | Tên | Cách xử lý thay đổi | Ví dụ |
|---|---|---|---|
| SCD Type 0 | Retain Original | Không bao giờ thay đổi | Ngày sinh, giới tính |
| SCD Type 1 | Overwrite | Ghi đè giá trị cũ bằng giá trị mới | Cập nhật email khách hàng |
| SCD Type 2 | Add New Row | Thêm dòng mới, đóng dòng cũ (effective_date, expiry_date) | Khách hàng đổi thành phố — giữ lại lịch sử |
| SCD Type 3 | Add New Column | Thêm cột previous_value | Sản phẩm đổi category — giữ category cũ + mới |
Star Schema vs Snowflake Schema
| Tiêu chí | Star Schema | Snowflake Schema |
|---|---|---|
| Cấu trúc | Fact ở giữa, dimension trực tiếp xung quanh | Dimension được normalize thêm (sub-dimension) |
| Số JOIN | Ít — fact JOIN trực tiếp dimension | Nhiều hơn — dimension JOIN sub-dimension |
| Query performance | Nhanh hơn — ít JOIN | Chậm hơn — nhiều JOIN |
| Dễ hiểu | ✅ DA dễ hiểu, dễ query | ❌ Phức tạp hơn |
| Dư thừa dữ liệu | Nhiều hơn (dimension denormalized) | Ít hơn (dimension normalized) |
| Recommended | ✅ Kimball khuyến nghị | Chỉ khi cần tiết kiệm storage đặc biệt |
Áp dụng cho Data Analyst
| Tình huống DA | Kimball áp dụng thế nào |
|---|---|
| Query doanh thu theo category + thời gian | fact_sales JOIN dim_product JOIN dim_date — rõ ràng hơn normalized schema |
| Phân tích khách hàng theo vùng miền | fact_orders JOIN dim_customer WHERE region = 'Bắc' — không cần JOIN 5 bảng |
| Báo cáo doanh thu theo quý tài chính | JOIN dim_date WHERE fiscal_quarter = 2 — dim_date có sẵn fiscal attributes |
| Track thay đổi giá sản phẩm | SCD Type 2 trên dim_product — mỗi thay đổi giá tạo record mới |
| Thiết kế DW cho sàn e-commerce VN | 4-step process: chọn process → xác định grain → chọn dimensions → chọn facts |
Ví dụ thực tế
Tình huống: Thiết kế Star Schema cho sàn e-commerce Việt Nam — phân tích doanh thu theo sản phẩm, khách hàng, thời gian, khu vực.
Star Schema — E-commerce Việt Nam:
┌───────────────┐
│ dim_product │
│───────────────│
│ product_key │──┐
│ product_name │ │
│ category │ │ ┌───────────────────────┐
│ brand │ │ │ fact_order_items │
│ supplier │ │ │───────────────────────│
└───────────────┘ ├────>│ order_item_key (PK) │
│ │ date_key (FK) │──> dim_date
┌───────────────┐ │ │ customer_key (FK) │──> dim_customer
│ dim_customer │ │ │ product_key (FK) │──> dim_product
│───────────────│ │ │ store_key (FK) │──> dim_store
│ customer_key │─────────────┘ │ quantity │
│ customer_name │ │ unit_price │
│ email │ │ discount_amount │
│ region │ │ line_total │
│ city │ └───────────────────────┘
│ segment │
│ signup_date │
└───────────────┘Query trên Star Schema — đơn giản, nhanh:
sql
-- Doanh thu theo category + quý + vùng miền (Star Schema query)
SELECT
d.quarter,
d.year,
p.category,
c.region,
SUM(f.line_total) AS total_revenue,
COUNT(DISTINCT f.order_item_key) AS total_items,
AVG(f.line_total) AS avg_item_value
FROM fact_order_items f
JOIN dim_date d ON f.date_key = d.date_key
JOIN dim_product p ON f.product_key = p.product_key
JOIN dim_customer c ON f.customer_key = c.customer_key
WHERE d.year = 2026
GROUP BY d.quarter, d.year, p.category, c.region
ORDER BY d.quarter, total_revenue DESC;3️⃣ DAMA DMBOK — Data Warehousing & Business Intelligence
Giới thiệu
DAMA DMBOK (Data Management Body of Knowledge) là framework toàn diện do DAMA International (Data Management Association) xuất bản — phiên bản 2 (2017) bao gồm 14 knowledge areas covering toàn bộ lifecycle quản trị dữ liệu. Trong đó, Chapter 11: Data Warehousing and Business Intelligence trực tiếp liên quan đến Buổi 6.
DAMA DMBOK không phải là "sách dạy viết SQL" — đó là khung tham chiếu cấp doanh nghiệp cho việc quản lý dữ liệu một cách có hệ thống. Trong bối cảnh Data Analyst, hiểu DAMA DMBOK giúp bạn thấy được bức tranh tổng thể: dữ liệu bạn query đến từ đâu (Data Integration), được tổ chức thế nào (Data Architecture), được quản trị ra sao (Data Governance), và phục vụ mục đích gì (BI & Analytics).
Đặc biệt, DAMA DMBOK nhấn mạnh rằng Data Warehouse không phải "chỉ là database to hơn" — đó là một thành phần trong kiến trúc dữ liệu (Data Architecture) của doanh nghiệp, được thiết kế có chủ đích cho analytics, với các quy trình ETL/ELT, data quality, metadata management, và governance controls.
Nội dung chính
DMBOK Data Management Framework — 14 Knowledge Areas
| # | Knowledge Area | Liên quan Buổi 6 | Vai trò |
|---|---|---|---|
| 1 | Data Governance | ⭐⭐ | Quản trị chính sách dữ liệu — ai được query gì |
| 2 | Data Architecture | ⭐⭐⭐ | Kiến trúc DW: OLTP → ETL → OLAP → BI |
| 3 | Data Modeling & Design | ⭐⭐⭐ | Dimensional modeling — star schema, fact & dimension |
| 4 | Data Storage & Operations | ⭐⭐ | Vận hành hệ thống DW — performance, backup |
| 5 | Data Security | ⭐ | Bảo mật dữ liệu trong DW |
| 6 | Data Integration & Interoperability | ⭐⭐⭐ | ETL/ELT — đưa dữ liệu vào DW |
| 7 | Document & Content Management | ⭐ | Quản lý tài liệu liên quan |
| 8 | Reference & Master Data | ⭐⭐ | Master data → dimension tables |
| 9 | Data Warehousing & BI | ⭐⭐⭐ | Core Buổi 6 — DW design, BI, reporting |
| 10 | Metadata Management | ⭐⭐ | Data dictionary, lineage — biết cột nào nghĩa gì |
| 11 | Data Quality | ⭐⭐ | Chất lượng dữ liệu trong DW |
| 12 | Big Data & Data Science | ⭐ | DW trong bối cảnh big data |
| 13 | Data Ethics | ⭐ | Đạo đức sử dụng dữ liệu |
| 14 | AI & Machine Learning (DMBOK 3 draft) | ⭐ | AI/ML features from DW |
Chapter 11 Deep Dive — Data Warehousing & BI
Mục tiêu của DW theo DAMA:
"Cung cấp dữ liệu tích hợp, nhất quán, lịch sử để hỗ trợ ra quyết định kinh doanh"
| Thành phần | English | Mô tả | Tool ví dụ |
|---|---|---|---|
| Data Sources | Source Systems | Hệ thống gốc — ERP, CRM, website, app | MySQL, PostgreSQL, API |
| ETL/ELT | Extract-Transform-Load | Trích xuất → biến đổi → tải vào DW | dbt, Airflow, Fivetran |
| Data Warehouse | Central DW | Kho dữ liệu trung tâm — star schema | BigQuery, Snowflake, Redshift |
| Data Mart | Subject-area DW | DW nhỏ cho 1 phòng ban cụ thể | Sales mart, Marketing mart |
| BI Layer | Reporting & Analytics | Dashboard, report, ad-hoc query | Looker, Tableau, Power BI |
| Metadata | Data about data | Data dictionary, lineage, schema docs | DataHub, Atlan, dbt docs |
Kiến trúc DW theo DAMA DMBOK:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ ERP │ │ CRM │ │ Website │ ← Source Systems (OLTP)
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└──────────┬──┴──────────┬──┘
│ ETL / ELT │ ← Extract, Transform, Load
└──────┬──────┘
│
┌───────▼───────┐
│ Data Warehouse │ ← Star Schema (OLAP)
│ (Star Schema) │
└───┬───┬───┬───┘
│ │ │
┌────────┘ │ └────────┐
┌─────▼─────┐ ┌────▼────┐ ┌────▼────┐
│ Sales Mart│ │ Mkt Mart│ │ Fin Mart│ ← Data Marts
└─────┬─────┘ └────┬────┘ └────┬────┘
│ │ │
└──────────┬─┴───────────┘
│
┌─────▼─────┐
│ BI & Report│ ← Dashboard, Analytics
└────────────┘Áp dụng cho Data Analyst
| Tình huống DA | DAMA DMBOK áp dụng thế nào |
|---|---|
| Hiểu data pipeline | DMBOK Data Integration → biết dữ liệu bạn query đi qua ETL nào |
| Kiểm tra data quality | DMBOK Data Quality → kiểm tra NULL, duplicate, inconsistency trước khi phân tích |
| Đọc data dictionary | DMBOK Metadata Management → hiểu từng cột nghĩa gì, đơn vị gì |
| Thiết kế dashboard | DMBOK DW & BI → hiểu data flow: source → DW → BI tool → insight |
| Hỏi DE tạo bảng mới | DMBOK Data Modeling → dùng đúng thuật ngữ: fact table, dimension, grain |
| Phân quyền truy cập data | DMBOK Data Governance → biết ai access được gì, chính sách gì |
Ví dụ thực tế
Tình huống: Data Analyst tại sàn e-commerce Việt Nam cần understand data pipeline — dữ liệu đơn hàng từ app → database → DW → dashboard.
📱 App Shopee VN → 🗄️ MySQL (OLTP) → 🔄 ETL (dbt) → 📊 BigQuery (DW) → 📈 Looker (BI)
Ở mỗi giai đoạn, DAMA DMBOK cung cấp framework:
- App → MySQL: Data Storage & Operations (how data is stored)
- MySQL → BigQuery: Data Integration (ETL pipeline)
- BigQuery schema: Data Modeling (star schema design — Kimball)
- BigQuery → Looker: DW & BI (how data serves business)
- Toàn bộ: Data Governance (who can access what)
- Mọi cột: Metadata Management (what each column means)🎓 Chứng chỉ liên quan
Lộ trình khuyến nghị cho Data Analyst
📌 Bắt đầu (Buổi 6):
→ Google Data Analytics Certificate — BigQuery + SQL nâng cao
→ HackerRank SQL (Advanced) — Window function practice
→ DataCamp SQL Associate Certificate
📈 Trung cấp (sau khóa học):
→ Google Cloud Professional Data Engineer — BigQuery, data pipeline
→ dbt Analytics Engineering Certification — modern DW, dimensional modeling
→ Snowflake SnowPro Core Certification — cloud DW
🎯 Nâng cao:
→ CDMP (Certified Data Management Professional) — DAMA International — DMBOK
→ Google Cloud Professional Cloud Database Engineer
→ AWS Certified Data Analytics — Specialty
📚 Sách bắt buộc:
→ "The Data Warehouse Toolkit" — Ralph Kimball (kinh thánh DW)
→ "Star Schema: The Complete Reference" — Christopher Adamson
→ "SQL for Data Scientists" — Renee Teate (chương Window Functions)
→ "Learning SQL" — Alan Beaulieu, O'Reilly (chương 16: Analytic Functions)So sánh chi tiết
| Tiêu chí | Google DA Cert | HackerRank SQL Advanced | dbt Analytics Eng | CDMP (DAMA) |
|---|---|---|---|---|
| Window Functions | ⭐⭐ Basics — ROW_NUMBER, LAG | ⭐⭐⭐ Problem-solving — queries thực tế | ⭐⭐ dbt context — CTE, window | ⭐ Concepts only |
| Data Warehouse | ⭐⭐ BigQuery basics | ⭐ Không focus | ⭐⭐⭐ Core — dimensional modeling, dbt | ⭐⭐⭐ DMBOK framework |
| Star Schema | ⭐ Concepts | ⭐ Không | ⭐⭐⭐ Build star schema with dbt | ⭐⭐⭐ Kimball theory |
| Hands-on practice | ⭐⭐ BigQuery | ⭐⭐⭐ Online judge | ⭐⭐⭐ dbt project | ⭐ Theory-focused |
| Industry recognition | Google + employers | Tech companies | Data teams, analytics eng | Data governance roles |
| Cost | ~$49/month (Coursera) | Miễn phí | ~$200 | ~$411 |
| Phù hợp nhất | Career starters | Practice + portfolio | Analytics eng / DA | Data management roles |
🔗 Ma trận tiêu chuẩn × Chủ đề buổi học
| Chủ đề Buổi 6 | ANSI SQL Window Functions | Kimball Dimensional Modeling | DAMA DMBOK |
|---|---|---|---|
| Window Functions (ROW_NUMBER, RANK...) | ⭐⭐⭐ Core — ANSI SQL:2003 định nghĩa syntax | ⭐ Dùng trong query trên star schema | ⭐ Không trực tiếp |
| LAG / LEAD (offset functions) | ⭐⭐⭐ Core — ANSI SQL:2011 | ⭐ MoM/YoY trên fact table | ⭐ Time-series analysis |
| Running Total (SUM OVER) | ⭐⭐⭐ Core — frame clause ANSI | ⭐⭐ Cumulative metrics trên fact | ⭐⭐ KPI tracking |
| Moving Average (AVG OVER) | ⭐⭐⭐ Core — ROWS BETWEEN | ⭐⭐ Trend analysis trên fact | ⭐⭐ Smoothing, forecasting |
| Percent of Total | ⭐⭐⭐ SUM OVER (PARTITION BY) | ⭐⭐ Portfolio mix analysis | ⭐⭐ Business reporting |
| CTE (Common Table Expression) | ⭐⭐⭐ ANSI SQL:1999 — WITH clause | ⭐⭐ Query phức tạp trên star schema | ⭐ Query organization |
| Star Schema | ⭐ Window Functions trên star | ⭐⭐⭐ Core — fact + dimension | ⭐⭐⭐ DW & BI chapter |
| Fact vs Dimension Table | ⭐ Không trực tiếp | ⭐⭐⭐ Core — 4-step process | ⭐⭐⭐ Data Modeling |
| OLTP vs OLAP | ⭐ SQL chạy trên cả hai | ⭐⭐⭐ OLAP = DW context | ⭐⭐⭐ Data Architecture |
| ETL / Data Pipeline | ⭐ Không trực tiếp | ⭐⭐ Data staging → DW | ⭐⭐⭐ Data Integration |
| Data Warehouse concepts | ⭐ SQL là ngôn ngữ query DW | ⭐⭐⭐ Core methodology | ⭐⭐⭐ DW & BI chapter |
| SCD (Slowly Changing Dimensions) | ⭐ Không trực tiếp | ⭐⭐⭐ Core — Type 0/1/2/3 | ⭐⭐ Data Quality, Modeling |
Chú thích: ⭐ = Liên quan gián tiếp | ⭐⭐ = Liên quan trực tiếp | ⭐⭐⭐ = Core/trọng tâm
📝 Checklist áp dụng cho Data Analyst
Window Functions Checklist
- [ ] Chọn đúng hàm: ROW_NUMBER (unique rank), RANK (skip ties), DENSE_RANK (no skip), NTILE (equal groups)
- [ ] PARTITION BY đúng: Chia nhóm phù hợp business context — partition by category, by region, by customer?
- [ ] ORDER BY trong OVER: Luôn specify khi dùng ranking hoặc offset functions
- [ ] Frame clause: Dùng
ROWS BETWEENcho running total/moving average — hiểu default behavior - [ ] ROWS vs RANGE: Ưu tiên
ROWScho kết quả deterministic,RANGEkhi cần tied values xử lý giống nhau - [ ] LAG/LEAD default: Specify default value cho dòng đầu/cuối —
LAG(revenue, 1, 0)thay vìLAG(revenue) - [ ] Tránh lặp OVER: Khi dùng nhiều window functions cùng partition + order → dùng
WINDOWclause (ANSI SQL)
Data Warehouse Checklist
- [ ] Xác định grain: 1 dòng trong fact table = 1 sự kiện gì? (1 đơn hàng? 1 line item? 1 click?)
- [ ] Fact table chỉ chứa: FK (tới dimension) + measures (số liệu) — KHÔNG chứa text mô tả
- [ ] Dimension table chứa: PK + descriptive attributes — KHÔNG chứa measures
- [ ] dim_date bắt buộc: Luôn tạo dimension date riêng — không dùng trực tiếp date column trong fact
- [ ] Naming convention:
fact_prefix cho fact table,dim_prefix cho dimension table - [ ] SCD awareness: Xác định dimension nào cần track history (Type 2) vs overwrite (Type 1)
- [ ] Star over Snowflake: Ưu tiên star schema trừ khi có lý do đặc biệt cần snowflake
Query trên Star Schema Checklist
- [ ] Bắt đầu từ fact table: FROM fact_xxx → JOIN dim_xxx
- [ ] JOIN đúng key: fact.xxx_key = dim.xxx_key — dùng surrogate key, không business key
- [ ] WHERE trên dimension: Lọc trên dimension table (WHERE d.year = 2026) thay vì trên fact (WHERE YEAR(date) = 2026)
- [ ] Aggregate trên fact: SUM/COUNT/AVG trên measures trong fact table
- [ ] GROUP BY trên dimension: GROUP BY dimension attributes (d.quarter, p.category, c.region)
- [ ] Window Functions trên star: Dùng ROW_NUMBER, LAG, SUM OVER trên fact table — partition by dimension attributes
Sau khi phân tích
- [ ] Validate kết quả: Cross-check running total cuối kỳ = tổng cả kỳ (sanity check)
- [ ] Kiểm tra NULL: LAG/LEAD trả NULL cho dòng đầu/cuối — xử lý bằng COALESCE hoặc WHERE
- [ ] Performance: Window Functions trên bảng lớn có thể chậm — kiểm tra execution plan
- [ ] Document: Comment giải thích business logic, ghi chú grain và dimension dùng
- [ ] Share: Lưu query có tên file rõ ràng, share với team qua Git/dbt
📚 Tài liệu tham khảo
Tiêu chuẩn chính thức
- ISO/IEC 9075:2023 — Information technology — Database languages — SQL — iso.org
- DAMA DMBOK 2nd Edition (2017) — Data Management Body of Knowledge — DAMA International — dama.org
- ISO/IEC 11179-5:2015 — Information technology — Metadata registries — iso.org
Sách kinh điển — Data Warehouse
- Kimball, R. & Ross, M. (2013) — "The Data Warehouse Toolkit", 3rd Edition, Wiley — Kinh thánh DW, dimensional modeling
- Adamson, C. (2010) — "Star Schema: The Complete Reference", McGraw-Hill — Deep dive star schema
- Inmon, W.H. (2005) — "Building the Data Warehouse", 4th Edition, Wiley — CIF approach (đối lập Kimball)
- Linstedt, D. & Olschimke, M. (2015) — "Building a Scalable Data Warehouse with Data Vault 2.0", Morgan Kaufmann — Data Vault approach
Sách kinh điển — SQL nâng cao
- Beaulieu, A. (2020) — "Learning SQL", 3rd Edition, O'Reilly — Chapter 16: Analytic Functions
- Teate, R. (2021) — "SQL for Data Scientists", Wiley — Window Functions cho DA
- Molinaro, A. (2020) — "SQL Cookbook", 2nd Edition, O'Reilly — Recipes cho window functions
- Celko, J. (2014) — "Joe Celko's Analytics and OLAP in SQL", Morgan Kaufmann — Advanced analytics in SQL
Bài viết & Tài liệu online
- Kimball Group Design Tips — kimballgroup.com — ETL subsystem, dimensional modeling tips
- dbt Docs — Best Practices — docs.getdbt.com — Modern DW with dbt
- Google BigQuery Documentation — Window Functions — cloud.google.com — Cloud DW window functions
- PostgreSQL Window Functions — postgresql.org — Tutorial chính thức
Practice & Tools
- DataLemur SQL Questions — datalemur.com — Window function interview questions
- LeetCode Database Problems — leetcode.com/problemset/database — Practice SQL problems
- HackerRank SQL Advanced — hackerrank.com/domains/sql — SQL challenges + certification
- SQLBolt — Advanced — sqlbolt.com — Interactive SQL lessons
- Mode Analytics SQL Tutorial — mode.com/sql-tutorial — SQL window functions for analytics
Video & Courses
- Google Data Analytics Certificate — Course 3 & 4 — BigQuery + SQL — Coursera
- DataCamp — Window Functions in SQL — datacamp.com — Interactive course
- freeCodeCamp — SQL Full Course — youtube.com — Free, comprehensive
- Kimball Group — YouTube — Dimensional modeling tutorials
🔗 Xem thêm Buổi 6
→ 📘 Nội dung chính → 📝 Blog → 🧠 Case Study → 🛠 Workshop → 🎮 Mini Game