r MS SQL Server) Does not yet support DATE[TIME] datatype and arithmetic for RANGE-type frames (MDEV-9727) * Does not support GROUPS-type frames (it seems that no popular database supports it, either) * Does not support frame exclusion (no other database seems to support it, either) (MDEV-9724) * Does not support explicit NULLS FIRST or NULLS LAST. * Does not support nested navigation in window functions (this is VALUE_OF(expr AT row_marker [, default_value) syntax) * The following window functions are supported: "Streamable" window functions: ROW_NUMBER, RANK, DENSE_RANK, Window functions that can be streamed once the number of rows in partition is known: PERCENT_RANK, CUME_DIST, NTILE * Aggregate functions that are currently supported as window functions are: COUNT, SUM, AVG, BIT_OR, BIT_AND, BIT_XOR. * Aggregate functions with the DISTINCT specifier (e.g. COUNT( DISTINCT x)) are not supported as window functions. Links ----- * MDEV-6115 is the main jira task for window functions development. Other tasks are are attached as sub-tasks * bb-10.2-mdev9543 is the feature tree for window functions. Development is ongoing, and this tree has the newest changes. * Testcases are in mysql-test/t/win*.test Examples -------- Given the following sample data: CREATE TABLE users ( email VARCHAR(30), first_name VARCHAR(30), last_name VARCHAR(30), account_type VARCHAR(30) ); INSERT INTO users VALUES ('admin@boss.org', 'Admin', 'Boss', 'admin'), ('bob.carlsen@foo.bar', 'Bob', 'Carlsen', 'regular'), ('eddie.stevens@data.org', 'Eddie', 'Stevens', 'regular'), ('john.smith@xyz.org', 'John', 'Smith', 'regular'), ('root@boss.org', 'Root', 'Chief', 'admin') First, let's order the records by email alphabetically, giving each an ascending rnum value starting with 1. This will make use of the ROW_NUMBER window function: SELECT row_number() OVER (ORDER BY email) AS rnum, email, first_name, last_name, account_type FROM users ORDER BY email; +------+------------------------+------------+-----------+--------------+ | rnum | email | first_name | last_name | account_type | +------+------------------------+------------+-----------+--------------+ | 1 | admin@boss.org | Admin | Boss | admin | | 2 | bob.carlsen@foo.bar | Bob | Carlsen | regular | | 3 | eddie.stevens@data.org | Eddie | Stevens | regular | | 4 | john.smith@xyz.org | John | Smith | regular | | 5 | root@boss.org | Root | Chief | admin | +------+------------------------+------------+-----------+-------------- We can generate separate sequences based on account type, using the PARTITION BY clause: SELECT row_number() OVER (PARTITION BY account_type ORDER BY email) AS rnum, email, first_name, last_name, account_type FROM users ORDER BY account_type,email; +------+------------------------+------------+-----------+--------------+ | rnum | email | first_name | last_name | account_type | +------+------------------------+------------+-----------+--------------+ | 1 | admin@boss.org | Admin | Boss | admin | | 2 | root@boss.org | Root | Chief | admin | | 1 | bob.carlsen@foo.bar | Bob | Carlsen | regular | | 2 | eddie.stevens@data.org | Eddie | Stevens | regular | | 3 | john.smith@xyz.org | John | Smith | regular | +------+------------------------+------------+-----------+--------------+ Given the following structure and data, we want to find the top 5 salaries from each department. CREATE TABLE employee_salaries (dept VARCHAR(20), name VARCHAR(20), salary INT(11)); INSERT INTO employee_salaries VALUES ('Engineering', 'Dharma', 3500), ('Engineering', 'Binh', 3000), ('Engineering', 'Adalynn', 2800), ('Engineering', 'Samuel', 2500), ('Engineering', 'Cveta', 2200), ('Engineering', 'Ebele', 1800), ('Sales', 'Carbry', 500), ('Sales', 'Clytemnestra', 400), ('Sales', 'Juraj', 300), ('Sales', 'Kalpana', 300), ('Sales',Ó¤h½