SQL Ranking Within Groups
RANK, formalized as a pattern: combine it with PARTITION BY and every group gets its own independent 1st place.
What & Why
Add PARTITION BY to any ranking function and the ranking restarts at 1 for every group — this is the pattern behind almost every "top performer per team/region/category" question.
See How It Works
BUSINESS QUESTION
Marketing ranks campaigns by spend inside each channel.
| id | name | channel | spend | start_date | end_date | status | target_segment |
|---|---|---|---|---|---|---|---|
| 1 | Spring Launch | google_ads | 55000.00 | 2024-01-15 | 2024-03-31 | active | smb |
| 2 | Retention Webinar | 45000.00 | 2024-02-10 | 2024-04-15 | active | enterprise | |
| 3 | Finance Retargeting | 50000.00 | 2024-03-12 | 2024-05-31 | active | enterprise | |
| 4 | Enterprise Search | google_ads | 60000.00 | 2024-04-01 | 2024-06-30 | active | enterprise |
EXAMPLE QUERY
SELECT
id AS campaign_id,
name,
channel,
spend,
RANK() OVER (PARTITION BY channel ORDER BY spend DESC) AS channel_rank
FROM marketing.campaigns
ORDER BY channel, channel_rank, campaign_id;RESULT — campaign rank restarts by channel
| campaign_id | name | channel | spend | channel_rank |
|---|---|---|---|---|
| 2 | Retention Webinar | 45000.00 | 1 | |
| 4 | Enterprise Search | google_ads | 60000.00 | 1 |
| 1 | Spring Launch | google_ads | 55000.00 | 2 |
| 3 | Finance Retargeting | 50000.00 | 1 |
The two google_ads campaigns form the only multi-row partition.
This lesson's practice is part of Pro.
Sign up free to try it on a real business scenario