Справочник по функциям

ROW_NUMBER

Нумерует строки раздела окна по порядку ORDER BY, начиная с 1.

MySQL 8.1
ROW_NUMBER() OVER ([PARTITION BY ...] [ORDER BY ...])

Параметры

PARTITION BYнеобязательный
Столбцы, по которым строки делятся на разделы, нумерация начинается заново в каждом
ORDER BYнеобязательный
Порядок, в котором строки нумеруются; без него строки нумеруются в произвольном порядке

Возвращаемое значение

Целое число (BIGINT UNSIGNED) от 1 до числа строк в разделе

Примеры

Нумерация строк по статусу

MySQL 8.1
SELECT member_name,
	status,
	ROW_NUMBER() OVER (
		ORDER BY status
	) AS row_num
FROM FamilyMembers;
member_namestatusrow_num
Lela Quinceydaughter1
Annie Quinceydaughter2
Wednesday Addamsdaughter3
Headley Quinceyfather4
Ernest Forrestfather5
Flavia Quinceymother6
Constance Forrestmother7
Andie Quinceyson8

Нумерация внутри каждого статуса

MySQL 8.1
SELECT member_name,
	status,
	birthday,
	ROW_NUMBER() OVER (
		PARTITION BY status
		ORDER BY birthday
	) AS num_in_status
FROM FamilyMembers;
member_namestatusbirthdaynum_in_status
Lela Quinceydaughter1985-06-071
Annie Quinceydaughter1988-04-102
Wednesday Addamsdaughter2005-01-133
Headley Quinceyfather1960-05-131
Ernest Forrestfather1961-09-112
Flavia Quinceymother1963-02-161
Constance Forrestmother1968-09-062
Andie Quinceyson1983-06-051

Подробности

Строки с одинаковыми значениями ORDER BY всё равно получают разные номера в произвольном порядке. Оконную функцию нельзя использовать в WHERE: чтобы оставить, например, первую строку каждого раздела, посчитайте номер в подзапросе и отфильтруйте во внешнем запросе.

Смотрите также

Где изучить