Skip to content

🏆 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ẩnTổ chức / Tác giảÁp dụng cho Buổi 6
1ANSI SQL Window Functions (SQL:2003+)ANSI / ISO (ISO/IEC 9075)Chuẩn Window Functions — ROW_NUMBER, RANK, LAG, LEAD, SUM OVER, frame clause
2Kimball Dimensional ModelingRalph Kimball / Kimball GroupStar schema, fact table, dimension table, slowly changing dimensions (SCD)
3DAMA DMBOK — Data Warehousing & BIDAMA InternationalKhung 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 BYhạ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ómHàmChuẩn ANSIMô tả
RankingROW_NUMBER()SQL:2003Số thứ tự duy nhất mỗi dòng trong window
RANK()SQL:2003Xếp hạng — bỏ qua thứ hạng khi có ties
DENSE_RANK()SQL:2003Xếp hạng — không bỏ qua thứ hạng khi có ties
NTILE(n)SQL:2003Chia đều dữ liệu thành n nhóm (quartile, decile...)
OffsetLAG(expr, offset, default)SQL:2011Truy cập giá trị dòng trước dòng hiện tại
LEAD(expr, offset, default)SQL:2011Truy cập giá trị dòng sau dòng hiện tại
FIRST_VALUE(expr)SQL:2003Giá trị đầu tiên trong window
LAST_VALUE(expr)SQL:2003Giá trị cuối cùng trong window
NTH_VALUE(expr, n)SQL:2011Giá trị thứ n trong window
AggregateSUM() OVERSQL:2003Tổng cộng trên window — running total
AVG() OVERSQL:2003Trung bình trên window — moving average
COUNT() OVERSQL:2003Đếm trên window
MIN() OVER, MAX() OVERSQL:2003Min/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 partition

Default frame behavior (quan trọng!)

Trường hợpDefault frameGiải thích
OVER () — không có ORDER BYToàn bộ partitionSUM(x) OVER () = tổng toàn bộ
OVER (ORDER BY col) — có ORDER BYRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWSUM(x) OVER (ORDER BY date) = running total
Explicit frameTheo frame bạn chỉ địnhROWS BETWEEN 6 PRECEDING AND CURRENT ROW = 7 dòng gần nhất

⚠️ ANSI trap: Khi có ORDER BY trong OVER, 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)

KeywordHoạt động theoVí dụ khi có tied values
ROWSVị trí vật lý (physical rows)Mỗi dòng tính riêng — deterministic
RANGEGiá 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 ROWS khi cần running total chính xác. Dùng RANGE khi 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 DAANSI Window Function áp dụng
Top N sản phẩm trong mỗi categoryROW_NUMBER() OVER (PARTITION BY category ORDER BY revenue DESC) → lọc WHERE row_num <= N
So sánh doanh thu MoMLAG(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àySUM(revenue) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
Moving average 7 ngàyAVG(dau) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
Tỷ trọng % trong tổngrevenue * 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áchFIRST_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 độ đọcdễ 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ướcEnglishMô tảOutput
1Select the business processChọn quy trình kinh doanh cần phân tích"Phân tích đơn hàng e-commerce"
2Declare the grainXá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)"
3Identify the dimensionsXác định các chiều mô tả — ai, cái gì, ở đâu, khi nào?dim_customer, dim_product, dim_date, dim_store
4Identify the factsXá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ểmChi tiết
Chứa gìCác metrics/measures (số liệu đo lường) + Foreign Keys tới dimension tables
Mỗi dòng1 sự kiện kinh doanh (1 giao dịch, 1 line item, 1 page view...)
Số dòngRấ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 đổiChỉ 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ạiEnglishMô tảVí dụ
AdditiveAdditive FactsCộng được theo mọi dimensionrevenue, quantity, discount
Semi-additiveSemi-additiveCộ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-additiveNon-additiveKhô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ểmChi tiết
Chứa gìThông tin mô tả (descriptive attributes) — ai, cái gì, ở đâu, khi nào
Mỗi dòng1 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ộtNhiều cột text (mô tả), ít cột số
Thay đổiCÓ 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) = 1 chạy chậm trên bảng lớn (full table scan). Khi JOIN với dim_date, bạn chỉ cần WHERE d.month_number = 1 — index-friendly, nhanh hơn 10–100x.

Slowly Changing Dimensions (SCD)

LoạiTênCách xử lý thay đổiVí dụ
SCD Type 0Retain OriginalKhông bao giờ thay đổiNgày sinh, giới tính
SCD Type 1OverwriteGhi đè giá trị cũ bằng giá trị mớiCập nhật email khách hàng
SCD Type 2Add New RowThê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 3Add New ColumnThêm cột previous_valueSản phẩm đổi category — giữ category cũ + mới

Star Schema vs Snowflake Schema

Tiêu chíStar SchemaSnowflake Schema
Cấu trúcFact ở giữa, dimension trực tiếp xung quanhDimension được normalize thêm (sub-dimension)
Số JOINÍt — fact JOIN trực tiếp dimensionNhiều hơn — dimension JOIN sub-dimension
Query performanceNhanh hơn — ít JOINChậ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ệuNhiề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 DAKimball áp dụng thế nào
Query doanh thu theo category + thời gianfact_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ềnfact_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ínhJOIN dim_date WHERE fiscal_quarter = 2 — dim_date có sẵn fiscal attributes
Track thay đổi giá sản phẩmSCD 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 VN4-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 AreaLiên quan Buổi 6Vai trò
1Data Governance⭐⭐Quản trị chính sách dữ liệu — ai được query gì
2Data Architecture⭐⭐⭐Kiến trúc DW: OLTP → ETL → OLAP → BI
3Data Modeling & Design⭐⭐⭐Dimensional modeling — star schema, fact & dimension
4Data Storage & Operations⭐⭐Vận hành hệ thống DW — performance, backup
5Data SecurityBảo mật dữ liệu trong DW
6Data Integration & Interoperability⭐⭐⭐ETL/ELT — đưa dữ liệu vào DW
7Document & Content ManagementQuản lý tài liệu liên quan
8Reference & Master Data⭐⭐Master data → dimension tables
9Data Warehousing & BI⭐⭐⭐Core Buổi 6 — DW design, BI, reporting
10Metadata Management⭐⭐Data dictionary, lineage — biết cột nào nghĩa gì
11Data Quality⭐⭐Chất lượng dữ liệu trong DW
12Big Data & Data ScienceDW trong bối cảnh big data
13Data EthicsĐạo đức sử dụng dữ liệu
14AI & 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ầnEnglishMô tảTool ví dụ
Data SourcesSource SystemsHệ thống gốc — ERP, CRM, website, appMySQL, PostgreSQL, API
ETL/ELTExtract-Transform-LoadTrích xuất → biến đổi → tải vào DWdbt, Airflow, Fivetran
Data WarehouseCentral DWKho dữ liệu trung tâm — star schemaBigQuery, Snowflake, Redshift
Data MartSubject-area DWDW nhỏ cho 1 phòng ban cụ thểSales mart, Marketing mart
BI LayerReporting & AnalyticsDashboard, report, ad-hoc queryLooker, Tableau, Power BI
MetadataData about dataData dictionary, lineage, schema docsDataHub, 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 DADAMA DMBOK áp dụng thế nào
Hiểu data pipelineDMBOK Data Integration → biết dữ liệu bạn query đi qua ETL nào
Kiểm tra data qualityDMBOK Data Quality → kiểm tra NULL, duplicate, inconsistency trước khi phân tích
Đọc data dictionaryDMBOK Metadata Management → hiểu từng cột nghĩa gì, đơn vị gì
Thiết kế dashboardDMBOK DW & BI → hiểu data flow: source → DW → BI tool → insight
Hỏi DE tạo bảng mớiDMBOK Data Modeling → dùng đúng thuật ngữ: fact table, dimension, grain
Phân quyền truy cập dataDMBOK 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 CertHackerRank SQL Advanceddbt Analytics EngCDMP (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 recognitionGoogle + employersTech companiesData teams, analytics engData governance roles
Cost~$49/month (Coursera)Miễn phí~$200~$411
Phù hợp nhấtCareer startersPractice + portfolioAnalytics eng / DAData management roles

🔗 Ma trận tiêu chuẩn × Chủ đề buổi học

Chủ đề Buổi 6ANSI SQL Window FunctionsKimball Dimensional ModelingDAMA 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 BETWEEN cho running total/moving average — hiểu default behavior
  • [ ] ROWS vs RANGE: Ưu tiên ROWS cho kết quả deterministic, RANGE khi 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 WINDOW clause (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

  1. ISO/IEC 9075:2023 — Information technology — Database languages — SQL — iso.org
  2. DAMA DMBOK 2nd Edition (2017) — Data Management Body of Knowledge — DAMA International — dama.org
  3. ISO/IEC 11179-5:2015 — Information technology — Metadata registries — iso.org

Sách kinh điển — Data Warehouse

  1. Kimball, R. & Ross, M. (2013)"The Data Warehouse Toolkit", 3rd Edition, Wiley — Kinh thánh DW, dimensional modeling
  2. Adamson, C. (2010)"Star Schema: The Complete Reference", McGraw-Hill — Deep dive star schema
  3. Inmon, W.H. (2005)"Building the Data Warehouse", 4th Edition, Wiley — CIF approach (đối lập Kimball)
  4. 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

  1. Beaulieu, A. (2020)"Learning SQL", 3rd Edition, O'Reilly — Chapter 16: Analytic Functions
  2. Teate, R. (2021)"SQL for Data Scientists", Wiley — Window Functions cho DA
  3. Molinaro, A. (2020)"SQL Cookbook", 2nd Edition, O'Reilly — Recipes cho window functions
  4. 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

  1. Kimball Group Design Tipskimballgroup.com — ETL subsystem, dimensional modeling tips
  2. dbt Docs — Best Practicesdocs.getdbt.com — Modern DW with dbt
  3. Google BigQuery Documentation — Window Functionscloud.google.com — Cloud DW window functions
  4. PostgreSQL Window Functionspostgresql.org — Tutorial chính thức

Practice & Tools

  1. DataLemur SQL Questionsdatalemur.com — Window function interview questions
  2. LeetCode Database Problemsleetcode.com/problemset/database — Practice SQL problems
  3. HackerRank SQL Advancedhackerrank.com/domains/sql — SQL challenges + certification
  4. SQLBolt — Advancedsqlbolt.com — Interactive SQL lessons
  5. Mode Analytics SQL Tutorialmode.com/sql-tutorial — SQL window functions for analytics

Video & Courses

  1. Google Data Analytics Certificate — Course 3 & 4 — BigQuery + SQL — Coursera
  2. DataCamp — Window Functions in SQLdatacamp.com — Interactive course
  3. freeCodeCamp — SQL Full Courseyoutube.com — Free, comprehensive
  4. Kimball Group — YouTube — Dimensional modeling tutorials

🔗 Xem thêm Buổi 6

📘 Nội dung chính📝 Blog🧠 Case Study🛠 Workshop🎮 Mini Game