惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
腾讯CDC
B
Blog RSS Feed
H
Help Net Security
J
Java Code Geeks
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
博客园_首页
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
博客园 - Franky
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 叶小钗
Martin Fowler
Martin Fowler

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Master Window Function trong SQL: Bí Kíp Tối Ưu Phân Tích...
ITPrep · 2026-05-09 · via DEV Community

Chào anh em Data và Backend! Khi làm việc với SQL, chắc hẳn ai cũng đã quá quen với GROUP BY. Dù rất mạnh mẽ, nhưng GROUP BY có một nhược điểm chí mạng: nó "gom" các dòng lại và làm mất đi chi tiết của từng dòng dữ liệu gốc.

Vậy nếu sếp yêu cầu: "Lấy ra chi tiết từng đơn hàng, kèm theo tổng doanh thu của cả tháng đó trên cùng một dòng" thì sao? Dùng Subquery hay JOIN lằng nhằng? Quên đi, đây chính là lúc Window Function (Hàm cửa sổ) tỏa sáng!

🪟 1. Window Function Là Gì?

Window Function cho phép bạn thực hiện tính toán trên một tập hợp các hàng liên quan đến hàng hiện tại (gọi là "cửa sổ" - window) mà không làm thay đổi số lượng hàng trả về.

Cấu trúc cốt lõi của một Window Function:
Để SQL biết bạn đang dùng Window Function, bạn bắt buộc phải có mệnh đề OVER(). Bên trong OVER() thường chứa:

  • PARTITION BY: Chia dữ liệu thành các nhóm nhỏ (giống GROUP BY nhưng không gộp dòng).
  • ORDER BY: Sắp xếp dữ liệu bên trong từng nhóm.
  • ROWS / RANGE: Định nghĩa khung cửa sổ hẹp hơn (ví dụ: chỉ tính tổng của 3 dòng gần nhất).

🛠️ 2. Các Loại Window Function "Nhẵn Mặt"

Chúng ta có 3 nhóm hàm chính hay dùng nhất:

A. Hàm Tổng Hợp (Aggregate Window Functions)

Vẫn là SUM, AVG, COUNT, MAX, MIN nhưng dùng kèm OVER().
Ví dụ: Tính tổng lũy kế doanh thu theo từng ngày trong năm:

SELECT
    MaDonHang,
    NgayDatHang,
    TongTien,
    SUM(TongTien) OVER (PARTITION BY YEAR(NgayDatHang) ORDER BY NgayDatHang) AS TongLuyKeNam
FROM
    DonHang;

Enter fullscreen mode Exit fullscreen mode

B. Hàm Xếp Hạng (Ranking Window Functions)

Cực kỳ hữu ích khi muốn tìm "Top N" sản phẩm, nhân viên xuất sắc.

  • ROW_NUMBER(): Đánh số thứ tự liên tục 1, 2, 3, 4 (không quan tâm giá trị trùng).
  • RANK(): Nếu điểm bằng nhau thì đồng hạng, nhưng sẽ bỏ qua thứ hạng tiếp theo (VD: 1, 2, 2, 4).
  • DENSE_RANK(): Đồng hạng nhưng KHÔNG bỏ qua thứ hạng tiếp theo (VD: 1, 2, 2, 3).

Ví dụ: Xếp hạng sản phẩm bán chạy nhất trong từng danh mục:

SELECT
    DanhMuc,
    TenSanPham,
    TongSoLuongBan,
    RANK() OVER (PARTITION BY DanhMuc ORDER BY TongSoLuongBan DESC) AS HangSanPham
FROM
    SanPhamBanChay;

Enter fullscreen mode Exit fullscreen mode

C. Hàm Giá Trị (Value Window Functions)

Giúp bạn lấy giá trị của dòng trước/dòng sau so với dòng hiện tại. Cực kỳ ngon để tính biến động, chênh lệch (MoM, YoY).

  • LAG(): Lấy giá trị của dòng phía trước.
  • LEAD(): Lấy giá trị của dòng phía sau.

Ví dụ: So sánh doanh số tháng này so với tháng trước:

SELECT
    Thang,
    DoanhSo,
    LAG(DoanhSo, 1, 0) OVER (ORDER BY Thang) AS DoanhSoThangTruoc,
    DoanhSo - LAG(DoanhSo, 1, 0) OVER (ORDER BY Thang) AS ChenhLech
FROM
    BaoCaoDoanhSo;

Enter fullscreen mode Exit fullscreen mode

⚡ 3. Bí Kíp Tối Ưu Hiệu Suất

Window Function dùng rất sướng nhưng nếu không cẩn thận sẽ làm server "thở oxy". Anh em lưu ý:

  1. Index là chân ái: Hãy đảm bảo các cột dùng trong PARTITION BYORDER BY đã được đánh Index phù hợp. Nếu không, DB sẽ phải sort thủ công rất tốn tài nguyên.
  2. Hạn chế window frame quá rộng: Dùng ROWS hay RANGE cho đúng. Tránh dùng UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING trên các tập dữ liệu khổng lồ nếu không thực sự cần thiết.
  3. Kết hợp với CTE (WITH ... AS): Nếu cần dùng nhiều Window Function phức tạp, hãy tách chúng ra bằng CTE để code dễ đọc và giúp DB tối ưu hóa Execution Plan tốt hơn.

🎯 Tóm Lại

Thay vì viết những câu subquery dài loằng ngoằng, chạy chậm rùa bò, Window Function mang đến một cú pháp thanh lịch và tốc độ thực thi vượt trội. Nếu anh em làm Data Analysis hay Backend chuyên xử lý báo cáo, đây là skill bắt buộc phải "nằm lòng".

Anh em thường dùng Window Function nào nhiều nhất trong project thực tế? Chia sẻ ở phần comment nhé! 👇

🔥 Khám phá thêm: Nếu muốn luyện thêm các bài toán về SQL, Tối ưu truy vấn hay Database Design, hãy ghé thăm blog ITPrep để nâng cấp bộ kỹ năng ngay hôm nay!


Nguồn tham khảo: ITPrep - Hướng Dẫn Chuyên Sâu về Window Function trong SQL