SQL Playground
Tutorials
SQL PlaygroundSQL FormatterSQL MinifierSyntax ValidatorJSON to SQLCSV to SQLSQL to JSON
Blog

© 2025 SQL Playground. Built for developers.

PrivacyTermsAbout
SQL Playground
Tutorials
SQL PlaygroundSQL FormatterSQL MinifierSyntax ValidatorJSON to SQLCSV to SQLSQL to JSON
Blog
Back to Blog
2025-11-26
4 min read

Understanding SQL Window Functions: A Visual Guide

sqltutorialwindow-functionsinteractiveanimation

Window functions are one of SQL's most powerful features, yet they often confuse beginners. Unlike regular aggregate functions that collapse rows into groups, window functions preserve all rows while performing calculations across a "window" of related data.

Think of it like looking through a sliding window as you move down your dataset—you can see and calculate based on what's visible in that window at each step.

What Makes Window Functions Special?

Regular aggregates like SUM() or COUNT() reduce multiple rows to a single result:

SELECT department, SUM(salary) FROM employees GROUP BY department;
-- Returns ONE row per department

Window functions keep all rows while adding calculated columns:

SELECT name, department, salary,
       SUM(salary) OVER (PARTITION BY department) as dept_total
FROM employees;
-- Returns ALL rows, with dept_total added to each

The Anatomy of a Window Function

FUNCTION_NAME() OVER (
    PARTITION BY column1    -- Optional: divide data into groups
    ORDER BY column2        -- Optional: define row order within partitions
    ROWS BETWEEN ...        -- Optional: define the window frame
)

Let's explore the most common window functions with interactive examples.

1. ROW_NUMBER() - Sequential Numbering

ROW_NUMBER() assigns a unique sequential number to each row within a partition.

Visualizing ROW_NUMBER:

Visualizing ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary)

Try it yourself:

Interactive SQL
Loading...

Use Case: Finding the top N performers in each department, pagination, or removing duplicates.

2. RANK() - Ranking with Gaps

RANK() is similar to ROW_NUMBER(), but when there are ties (same ORDER BY value), it assigns the same rank and skips the next numbers.

Visualizing RANK:

Visualizing RANK() OVER ( ORDER BY score)

Interactive SQL
Loading...

Observation: Bob and Charlie both scored 90, so they both get rank 2. Diana gets rank 4 (not 3), because ranks 2 and 3 are "used up" by the tie.

3. Running Totals with SUM()

Window functions can calculate running totals by using SUM() with an ORDER BY clause.

Visualizing Running SUM:

Visualizing SUM() OVER ( ORDER BY id)

Interactive SQL
Loading...

Use Case: Cumulative metrics like year-to-date sales, running balances, or progress tracking.

Key Takeaways

  1. Window functions preserve rows - Unlike GROUP BY, you get all your original rows back.
  2. PARTITION BY divides data - Like GROUP BY, but without collapsing rows.
  3. ORDER BY defines calculation order - Critical for functions like ROW_NUMBER(), RANK(), and running totals.
  4. Combine with regular columns - You can mix window functions with normal columns and WHERE clauses.

Practice Challenge

Try modifying the queries above to:

  • Find the 2nd highest salary in each department
  • Calculate the difference between each month's revenue and the previous month
  • Rank students but reset the ranking for each class

Window functions unlock powerful analytics that would be complex or impossible with standard SQL. Master them, and you'll write cleaner, faster queries!

Share this article:

© 2025 SQL Playground. Built for developers.

PrivacyTermsAbout