SQL Window Functions Interview Questions
Master SQL Window Functions with interview-focused questions covering OVER, PARTITION BY, ORDER BY, ROW_NUMBER, RANK, DENSE_RANK, NTILE, LEAD, LAG, FIRST_VALUE, LAST_VALUE, running totals, moving averages, and enterprise production best practices.
Introduction
Traditional aggregate functions like
- SUM()
- COUNT()
- AVG()
collapse multiple rows into a single result.
However, business applications often need
- Employee Ranking
- Running Totals
- Previous Transactions
- Next Transactions
- Top N Employees
- Moving Averages
- Department-wise Ranking
Window Functions solve these problems while preserving every row.
Window Functions are among the most frequently asked SQL interview topics for
- Senior Java Developers
- Backend Engineers
- Data Engineers
- Database Developers
- Solution Architects
Window Function Architecture
flowchart LR
Table --> WindowFunction["Window Function"]
WindowFunction["Window Function"] --> Partition
Partition --> Result
Sample Employee Table
| ID | Name | Department | Salary |
|---|---|---|---|
| 101 | John | IT | 90000 |
| 102 | Alice | HR | 85000 |
| 103 | David | IT | 95000 |
| 104 | Bob | Finance | 70000 |
| 105 | Emma | HR | 78000 |
1. What is a Window Function?
Answer
A Window Function performs calculations across a set of rows while preserving each individual row.
Unlike GROUP BY,
it does not reduce multiple rows into one.
Window Function
Rows
↓
Window
↓
Calculation
↓
Every Row Preserved
2. Why are Window Functions used?
Window Functions are used for
- Ranking
- Running Totals
- Moving Averages
- Previous Row Access
- Next Row Access
- Percentiles
- Reporting
3. What is the OVER clause?
OVER defines
the window
over which
the function executes.
Basic Syntax
SELECT salary,
SUM(salary)
OVER()
FROM Employee;
OVER Clause
flowchart LR
Rows --> OVER
OVER --> Calculation
4. What is PARTITION BY?
PARTITION BY divides data
into logical groups.
Each partition is processed independently.
Example
SELECT name,
department,
salary,
AVG(salary)
OVER(PARTITION BY department)
FROM Employee;
PARTITION BY
Employee
↓
IT
↓
HR
↓
Finance
5. What is ORDER BY inside OVER?
ORDER BY defines
the order
within each partition.
Example
ROW_NUMBER()
OVER(ORDER BY salary DESC)
6. What is ROW_NUMBER()?
ROW_NUMBER assigns
a unique sequential number
to every row.
Example
SELECT name,
ROW_NUMBER()
OVER(ORDER BY salary DESC)
AS row_num
FROM Employee;
Result
| Name | Row Number |
|---|---|
| David | 1 |
| John | 2 |
| Alice | 3 |
ROW_NUMBER
Salary Desc
↓
1
↓
2
↓
3
7. What is RANK()?
RANK assigns
the same rank
to duplicate values.
It skips ranks after ties.
Example
100
Rank 1
100
Rank 1
90
Rank 3
8. What is DENSE_RANK()?
DENSE_RANK also assigns
the same rank
to duplicates
but does not skip numbers.
Example
100
Rank 1
100
Rank 1
90
Rank 2
ROW_NUMBER vs RANK vs DENSE_RANK
| Salary | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 100 | 1 | 1 | 1 |
| 100 | 2 | 1 | 1 |
| 90 | 3 | 3 | 2 |
9. Difference between ROW_NUMBER, RANK and DENSE_RANK?
| ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|
| Always Unique | Duplicate Rank | Duplicate Rank |
| No Ties | Skips Rank | No Skips |
| Sequential | Gap Exists | Continuous |
10. What is NTILE()?
NTILE divides
rows
into equal-sized groups.
Example
SELECT name,
NTILE(4)
OVER(ORDER BY salary DESC)
FROM Employee;
Useful for
- Quartiles
- Percentiles
- Bucket Analysis
NTILE
Employees
↓
Bucket 1
↓
Bucket 2
↓
Bucket 3
↓
Bucket 4
11. What is LEAD()?
LEAD returns
the next row's value.
Example
SELECT salary,
LEAD(salary)
OVER(ORDER BY salary)
FROM Employee;
LEAD
70000
↓
78000
↓
85000
12. What is LAG()?
LAG returns
the previous row's value.
Example
SELECT salary,
LAG(salary)
OVER(ORDER BY salary)
FROM Employee;
LAG
85000
↑
78000
↑
70000
13. What is FIRST_VALUE()?
Returns
the first value
within the window.
Example
SELECT name,
FIRST_VALUE(name)
OVER(ORDER BY salary DESC)
FROM Employee;
14. What is LAST_VALUE()?
Returns
the last value
within the window.
Example
SELECT name,
LAST_VALUE(name)
OVER(
ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
)
FROM Employee;
Note:
LAST_VALUE()often requires an explicit window frame (ROWS BETWEEN ...) to return the expected last row in the partition.
15. What is a Running Total?
Running Total
calculates
the cumulative sum.
Example
SELECT salary,
SUM(salary)
OVER(
ORDER BY id
)
AS running_total
FROM Employee;
Running Total
100
↓
300
↓
600
↓
1000
16. What is a Moving Average?
Moving Average
calculates
the average
over a sliding window.
Example
AVG(salary)
OVER(
ORDER BY id
ROWS BETWEEN 2 PRECEDING
AND CURRENT ROW
)
17. What is the Window Frame?
A Window Frame defines
which rows
participate
in the calculation.
Example
ROWS BETWEEN
UNBOUNDED PRECEDING
AND CURRENT ROW
Window Frame
Current Row
↓
Previous Rows
↓
Calculation
18. Banking Example
Running Account Balance
SUM(amount)
OVER(
ORDER BY transaction_date
)
19. HR Example
Department Ranking
RANK()
OVER(
PARTITION BY department
ORDER BY salary DESC
)
20. E-Commerce Example
Top Products
ROW_NUMBER()
OVER(
ORDER BY sales DESC
)
21. Healthcare Example
Latest Patient Visits
ROW_NUMBER()
OVER(
PARTITION BY patient_id
ORDER BY visit_date DESC
)
22. Social Media Example
Most Active Users
DENSE_RANK()
OVER(
ORDER BY post_count DESC
)
23. Analytics Example
Monthly Running Revenue
SUM(revenue)
OVER(
ORDER BY month
)
24. Production Example
Top 3 Employees per Department
SELECT *
FROM
(
SELECT *,
ROW_NUMBER()
OVER(
PARTITION BY department
ORDER BY salary DESC
) rn
FROM Employee
) e
WHERE rn <= 3;
25. Common Mistakes
- Confusing GROUP BY with Window Functions
- Forgetting OVER clause
- Missing ORDER BY
- Choosing wrong ranking function
- Forgetting window frame for LAST_VALUE
26. Performance Tips
- Index columns used in PARTITION BY.
- Index columns used in ORDER BY where appropriate.
- Avoid unnecessary sorting.
- Use execution plans.
- Minimize large window frames when possible.
- Process only required rows.
27. Window Functions vs GROUP BY
| Window Function | GROUP BY |
|---|---|
| Preserves Rows | Groups Rows |
| Analytics | Aggregation |
| Ranking | Summary |
| Running Totals | Single Result |
28. Best Practices
- Choose the correct ranking function.
- Use PARTITION BY carefully.
- Keep window definitions simple.
- Specify window frames explicitly when needed.
- Index sorting columns.
- Avoid unnecessary partitions.
- Review execution plans.
- Test on production-sized datasets.
- Use aliases.
- Keep queries readable.
29. Real Query Execution Flow
flowchart LR
FROM --> WhereGroupByHaving["WHERE --> GROUP BY --> HAVING --> Window Function --> SELECT --> OrderBy["ORDER BY"]"]
30. Enterprise Best Practices
- Use ROW_NUMBER for Top-N queries.
- Use RANK when gaps are acceptable.
- Use DENSE_RANK for continuous ranking.
- Use LEAD and LAG instead of self joins.
- Use running totals for financial reporting.
- Define window frames explicitly for cumulative calculations.
- Create indexes for PARTITION BY and ORDER BY columns.
- Benchmark analytical queries.
- Review execution plans regularly.
- Keep window queries modular and readable.
Window Function Workflow
flowchart LR
Rows --> Partition
Partition --> Sort
Sort --> WindowFunction["Window Function"]
WindowFunction["Window Function"] --> Result
Quick Revision
| Topic | Key Point |
|---|---|
| Window Function | Preserves Rows |
| OVER | Defines Window |
| PARTITION BY | Creates Groups |
| ORDER BY | Defines Row Order |
| ROW_NUMBER | Unique Sequence |
| RANK | Skips Ranks |
| DENSE_RANK | No Skipped Ranks |
| LEAD | Next Row |
| LAG | Previous Row |
| NTILE | Equal Buckets |
| FIRST_VALUE | First Value |
| LAST_VALUE | Last Value |
| Running Total | Cumulative Sum |
| Moving Average | Sliding Average |
Interview Tips
Interviewers frequently ask
- What is a Window Function?
- GROUP BY vs Window Functions.
- Explain OVER clause.
- What is PARTITION BY?
- ROW_NUMBER vs RANK vs DENSE_RANK.
- LEAD vs LAG.
- What is NTILE?
- Running Total query.
- Top N Employees per Department.
- Performance optimization for Window Functions.
A strong interview explanation is:
"Window Functions perform calculations across a set of related rows while preserving every row in the result set. The OVER clause defines the window, PARTITION BY divides rows into logical groups, and ORDER BY determines the processing order within each partition. Functions such as ROW_NUMBER, RANK, DENSE_RANK, LEAD, LAG, NTILE, FIRST_VALUE, LAST_VALUE, and running totals are widely used for analytical reporting. Compared to GROUP BY, Window Functions provide row-level analytics without collapsing the result set."
Summary
Window Functions are one of the most powerful SQL features for analytical queries. They enable ranking, cumulative calculations, previous and next row access, moving averages, and advanced reporting while preserving every row in the dataset. Features such as OVER, PARTITION BY, ORDER BY, ROW_NUMBER, RANK, DENSE_RANK, LEAD, LAG, FIRST_VALUE, LAST_VALUE, and NTILE are essential for solving real-world business problems efficiently.
Mastering Window Functions is critical for Backend Developers, Data Engineers, Database Engineers, Java Developers, and Solution Architects working with enterprise reporting, analytics, and high-performance SQL systems.