πŸŽ‰ 75% of content is free forever β€” Unlock Premium from $10/mo β†’
CW
Search courses…
πŸ’Ό Servicesℹ️ Aboutβœ‰οΈ ContactView Pricing Plansfrom $10

Introduction to Window Functions

Window FunctionsWindow Functions Introduction🟒 Free Lesson

Advertisement

Window Functions

Introduction to Window Functions

Perform calculations across sets of rows while preserving individual rows β€” no GROUP BY required.

  • Row-Preserving β€” Results include every row from the original query
  • PARTITION BY β€” Break data into logical groups for calculations
  • ORDER BY β€” Define row sequence within each partition Window functions bridge the gap between aggregate and row-level queries.

What Are Window Functions?

Aggregate (GROUP BY)dept | name | salaryEng | Alice | 80kEng | Bob | 75kSales| Carol | 65kEng:2 | Sales:1Rows collapsedWindow Functiondept | name | salary | SUMEng | Alice | 80k | 155kEng | Bob | 75k | 155kSales| Carol | 65k | 65kAll rows preservedRows preserved + computed

Window functions operate on a "window" of rows defined by the OVER() clause. They are essential for tasks like ranking, running totals, moving averages, and comparing rows without using subqueries or self-joins.

Window Functions vs Aggregate Functions

FeatureAggregate FunctionsWindow Functions
Row OutputCollapses rowsPreserves all rows
GROUP BYRequiredNot required
OVER() ClauseNot usedRequired
Calculation ScopeEntire groupDefined window
Example UseSUM by departmentRunning total per employee

Syntax Overview

-- Basic window function structure
SELECT
    employee_name,
    department,
    salary,
    SUM(salary) OVER (PARTITION BY department) AS dept_total_salary,
    salary - SUM(salary) OVER (PARTITION BY department) AS diff_from_dept_total
FROM employees;
-- Using multiple window functions in one query
SELECT
    employee_name,
    department,
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS overall_rank,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank,
    AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM employees;

Window Function Categories

CategoryFunctionsPurpose
RankingROW_NUMBER, RANK, DENSE_RANK, NTILEAssign positions to rows
AggregateSUM, AVG, COUNT, MIN, MAXCompute running or group totals
ValueLAG, LEAD, FIRST_VALUE, LAST_VALUEAccess other rows in the window
DistributionPERCENT_RANK, CUME_DIST, NTILEStatistical distribution

Practical Example: Salary Analysis

-- Comprehensive employee salary analysis using window functions
SELECT
    e.employee_name,
    e.department,
    e.salary,
    -- Rank employees within their department
    RANK() OVER (
        PARTITION BY e.department
        ORDER BY e.salary DESC
    ) AS dept_salary_rank,
    -- Compare to department average
    ROUND(e.salary - AVG(e.salary) OVER (PARTITION BY e.department), 2) AS vs_dept_avg,
    -- Running total of salaries in department
    SUM(e.salary) OVER (
        PARTITION BY e.department
        ORDER BY e.salary DESC
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS running_dept_total,
    -- Percentage of department total
    ROUND(e.salary / SUM(e.salary) OVER (PARTITION BY e.department) * 100, 1) AS pct_of_dept
FROM employees e
ORDER BY e.department, dept_salary_rank;

Aggregate Window Functions

-- Running total and moving average
SELECT
    order_date,
    order_amount,
    SUM(order_amount) OVER (ORDER BY order_date) AS running_total,
    AVG(order_amount) OVER (
        ORDER BY order_date
        ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
    ) AS moving_avg_3,
    COUNT(*) OVER (ORDER BY order_date) AS cumulative_count
FROM orders;

Quick Reference Table

ClausePurposeRequired
OVER()Marks a window functionYes
PARTITION BYDivides rows into groupsNo
ORDER BYOrders rows within partitionNo (but often needed)
ROWS/RANGEDefines frame boundariesNo

Need Expert SQL Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement