SQL Server Tip: Understanding Window Functions - ROW_NUMBER, RANK, DENSE_RANK

Why This Matters
Window functions in SQL Server provide a powerful way to perform calculations across a set of table rows that are somehow related to the current row. Understanding these functions is essential for data engineers and BI developers to efficiently manipulate and analyze data within SQL Server.
Overview of Window Functions
Window functions operate on a set of rows and return a single value for each row. The most commonly used window functions are:
- ROW_NUMBER : Assigns a unique sequential integer to rows within a partition of a result set.
- RANK : Assigns a rank to each row within a partition, with gaps in ranking when there are ties.
- DENSE_RANK : Similar to RANK, but without gaps in ranking when there are ties.
Step-by-Step Examples
1. Creating Sample Data
sql
CREATE TABLE Employee (
ID INT,
Name NVARCHAR(50),
Department NVARCHAR(50),
Salary DECIMAL(10, 2)
);
INSERT INTO Employee (ID, Name, Department, Salary) VALUES
(1, 'Amit', 'Sales', 60000),
(2, 'Raj', 'Sales', 70000),
(3, 'Priya', 'HR', 80000),
(4, 'Sita', 'HR', 70000),
(5, 'Vikram', 'IT', 90000);
2. Using ROW_NUMBER
To assign a unique sequential integer to each employee within their respective department, you can use:
sql
SELECT ID, Name, Department, Salary,
ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RowNum
FROM Employee;
This will assign row numbers starting from 1 within each department, ordered by salary.
3. Using RANK
To assign ranks to employees based on their salaries, allowing ties to have the same rank:
sql
SELECT ID, Name, Department, Salary,
RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank
FROM Employee;
In this case, if two employees in the same department have the same salary, they will receive the same rank, and the next rank will skip the next number.
4. Using DENSE_RANK
If you want to rank employees in such a way that there are no gaps in ranks, use:
sql
SELECT ID, Name, Department, Salary,
DENSE_RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS DenseRank
FROM Employee;
Here, even if there is a tie, the next employee will get the next consecutive rank.
Troubleshooting/FAQ
Q: What happens if there are no rows in the result set?
A: If the result set has no rows, the output will simply be empty; no errors will be raised.
Q: Can I use these functions without a PARTITION BY clause?
A: Yes, you can use these functions without a PARTITION BY clause. In that case, the function will treat all rows as a single group.
Q: What is the performance impact of using window functions?
A: Generally, window functions are optimized for performance, but it’s important to consider the size of your dataset. Testing and optimization may be necessary for large datasets.
Quick Checklist
- Prerequisites (tools/versions) are listed clearly.
- Setup steps are complete and reproducible.
- Include at least one runnable code example (SQL/Python/YAML).
- Explain why each step matters (not just how).
- Add Troubleshooting/FAQ for common errors.
2-Minute Case Study
Anita, 28, aims for ₹4 lakh emergency fund in 18 months. She picks a low-risk liquid/debt fund, sets a ₹22,000 SIP, and reviews once a quarter. For retirement, she chooses a Nifty 50 index fund with a 20-year SIP, increasing contributions 5% yearly.
FAQ
How much should I invest monthly?
Work backwards from goal and date; SIP = Goal ÷ Months (adjust for expected return).
Direct vs Regular plan?
Direct plans have lower expense ratios; over time that compounds to higher returns.
When should I sell?
Review annually. Rebalance if allocation drifts by >5–10% or when a goal is fully funded.
No comments:
Post a Comment