Window Functions
Partition Rank
Ranking Inside Groups
PARTITION BY restarts a window function for each group.
Program
Play the query to rank sellers within each region after a selectable amount filter.
partition_rank.sql
Replay: real traced execution (multi-file project)
CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);
INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);
WITH params(min_amount) AS (VALUES (25)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;
CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);
INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);
WITH params(min_amount) AS (VALUES (20)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;
CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);
INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);
WITH params(min_amount) AS (VALUES (30)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;
sales ← 0 rows
1CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);values this step0 rowssalessales ← 4 rows
1CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);3WITH params(min_amount) AS (VALUES (25)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;values this step4 rowssalesresult ← 3 rows
2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);3WITH params(min_amount) AS (VALUES (25)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;values this step3 rowsresult
sales ← 0 rows
1CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);values this step0 rowssalessales ← 4 rows
1CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);3WITH params(min_amount) AS (VALUES (20)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;values this step4 rowssalesresult ← 4 rows
2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);3WITH params(min_amount) AS (VALUES (20)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;values this step4 rowsresult
sales ← 0 rows
1CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);values this step0 rowssalessales ← 4 rows
1CREATE TABLE sales (region TEXT, seller TEXT, amount INTEGER);2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);3WITH params(min_amount) AS (VALUES (30)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;values this step4 rowssalesresult ← 2 rows
2INSERT INTO sales VALUES ('east', 'Ada', 30), ('east', 'Lin', 20), ('west', 'Mia', 25), ('west', 'Noor', 35);3WITH params(min_amount) AS (VALUES (30)) SELECT region, seller, amount, RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS region_rank FROM sales WHERE amount >= (SELECT min_amount FROM params) ORDER BY region, region_rank;values this step2 rowsresult
Follow the Groups
- The default
min_amountis25. - The filter keeps east Ada
30, west Noor35, and west Mia25. - Ranking restarts inside each region.
- Ada is rank
1in east; Noor is rank1in west. - Mia is the next kept west row, so Mia gets rank
2. | region | seller | amount | rank in region | | --- | --- | --- | --- | | east | Ada | 30 | 1 | | west | Noor | 35 | 1 | | west | Mia | 25 | 2 |
PARTITION BY
`PARTITION BY region` restarts ranking for each region.
RANK
`RANK()` gives equal values the same rank when ties exist.
grouped window
Partitioned windows combine row detail with grouped calculation.
Exercise: partition_rank.sql
Reproduce the default ranks, then use the pinned min_amount variants to predict why 20 also keeps east Lin as rank 2 and 30 leaves only Ada and Noor.