Window functions are powerful tools in SQL that allow you to perform calculations across a set of table rows related to the current row. This section covers how to use window functions such as ROWNUMBER, RANK, and NTILE to perform various analytical tasks.
ROWNUMBER is a window function that assigns a unique sequential integer to each row within a partition of a result set.
ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2)- PARTITION BY: Optional clause that divides the result set into partitions. The
ROWNUMBERis reset for each partition. - ORDER BY: Defines the order of rows within each partition.
Example
Calculate the row number for each product category ordered by total sales:
SELECT
productid,
productcategory,
totalsales,
ROW_NUMBER() OVER (PARTITION BY productcategory ORDER BY totalsales DESC) AS row_num
FROM
sales;RANK is a window function that assigns a rank to each row within a partition of a result set, with gaps in rank numbers if there are ties.
RANK() OVER (PARTITION BY column1 ORDER BY column2)- PARTITION BY: Optional clause that divides the result set into partitions. The ranking is reset for each partition.
- ORDER BY: Defines the order of rows within each partition.
Example
Rank products by total sales within each product category:
SELECT
productid,
productcategory,
totalsales,
RANK() OVER (PARTITION BY productcategory ORDER BY totalsales DESC) AS sales_rank
FROM
sales;NTILE is a window function that divides the result set into a specified number of groups, assigning each row to a bucket or group.
NTILE(num_buckets) OVER (ORDER BY column)- num_buckets: Specifies the number of groups or buckets to divide the result set into.
- ORDER BY: Defines the order of rows for partitioning into groups.
Example
Divide customers into quartiles based on their order amounts:
SELECT
customerid,
orderamount,
NTILE(4) OVER (ORDER BY orderamount) AS quartile
FROM
orders;- Find any
customerthat has more then oneorder, usingrow_number(). - find the
rankallproductssold.
Previous: Locking and Concurrency | End - Congratulations 🥳: