SQL REFERENCE
Window Functions
Compute values across related rows without collapsing the result set, using OVER with PARTITION BY and ORDER BY.
Syntax
function_name(args) OVER (
PARTITION BY col1, col2
ORDER BY col3 ASC|DESC
frame_clause
)
Ranking Functions
ROW_NUMBER
SELECT grp, val, ROW_NUMBER() OVER (PARTITION BY grp ORDER BY val) AS rn
FROM w ORDER BY grp, val;
-- a, 10, 1 | a, 20, 2 | a, 30, 3 | b, 40, 1 | b, 50, 2 | b, 60, 3
RANK
SELECT grp, val, RANK() OVER (PARTITION BY grp ORDER BY val) AS rnk
FROM wr ORDER BY grp, val;
-- a, 10, 1 | a, 10, 1 | a, 20, 3 (gaps at ties)
DENSE_RANK
SELECT grp, val, DENSE_RANK() OVER (PARTITION BY grp ORDER BY val) AS drnk
FROM wr ORDER BY grp, val;
-- a, 10, 1 | a, 10, 1 | a, 20, 2 (no gaps)
NTILE
SELECT grp, val, NTILE(2) OVER (PARTITION BY grp ORDER BY val) AS tile
FROM w ORDER BY grp, val;
-- a, 10, 1 | a, 20, 1 | a, 30, 2 | b, 40, 1 | b, 50, 1 | b, 60, 2
Aggregate Window Functions
-- Running SUM
SELECT grp, val, SUM(val) OVER (PARTITION BY grp ORDER BY val) AS running_sum
FROM w ORDER BY grp, val;
-- a,10,10 | a,20,30 | a,30,60 | b,40,40 | b,50,90 | b,60,150
-- Partition AVG (no ORDER BY = full partition)
SELECT grp, val, AVG(val) OVER (PARTITION BY grp) AS avg_val
FROM w ORDER BY grp, val;
-- a: 20.0 for all | b: 50.0 for all
-- MIN / MAX over partition
SELECT grp, val, MIN(val) OVER (PARTITION BY grp) AS min_val
FROM w ORDER BY grp, val;
-- COUNT over partition
SELECT grp, val, COUNT(val) OVER (PARTITION BY grp) AS cnt
FROM w ORDER BY grp, val;
-- All 3 for both groups
Value Functions
LAG / LEAD
SELECT grp, val, LAG(val, 1) OVER (PARTITION BY grp ORDER BY val) AS prev_val
FROM w ORDER BY grp, val;
-- a,10,0 | a,20,10 | a,30,20 | b,40,0 | b,50,40 | b,60,50
SELECT grp, val, LEAD(val, 1) OVER (PARTITION BY grp ORDER BY val) AS next_val
FROM w ORDER BY grp, val;
FIRST_VALUE / LAST_VALUE
SELECT grp, val, FIRST_VALUE(val) OVER (PARTITION BY grp ORDER BY val) AS fv
FROM w ORDER BY grp, val;
-- a: 10 for all | b: 40 for all
SELECT grp, val, LAST_VALUE(val) OVER (
PARTITION BY grp ORDER BY val
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lv FROM w ORDER BY grp, val;
-- a: 30 for all | b: 60 for all
Multiple Window Functions
SELECT grp, val,
ROW_NUMBER() OVER (PARTITION BY grp ORDER BY val) AS rn,
RANK() OVER (PARTITION BY grp ORDER BY val) AS rnk
FROM wr ORDER BY grp, val;
Multi-Key Partition
SELECT g1, g2, v, ROW_NUMBER() OVER (PARTITION BY g1, g2 ORDER BY v) AS rn
FROM wm ORDER BY g1, g2, v;