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

FIRST_VALUE

Возвращает значение column из первой строки рамки окна.

MySQL 8.1
FIRST_VALUE(column) OVER ([PARTITION BY ...] [ORDER BY ...] [frame])

Параметры

column
Столбец или выражение, значение которого нужно вернуть
PARTITION BYнеобязательный
Столбцы, по которым строки делятся на разделы
ORDER BYнеобязательный
Порядок строк в разделе, определяющий, какая строка первая; без него первая строка произвольная
frameключевое словонеобязательный
Рамка окна: ROWS или RANGE BETWEEN начало AND конец; по умолчанию от начала раздела до текущей строки

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

Значение того же типа, что и column

Примеры

Самый старший в каждом статусе

MySQL 8.1
SELECT member_name,
	status,
	birthday,
	FIRST_VALUE(member_name) OVER (
		PARTITION BY status
		ORDER BY birthday
	) AS oldest_in_status
FROM FamilyMembers;
member_namestatusbirthdayoldest_in_status
Lela Quinceydaughter1985-06-07Lela Quincey
Annie Quinceydaughter1988-04-10Lela Quincey
Wednesday Addamsdaughter2005-01-13Lela Quincey
Headley Quinceyfather1960-05-13Headley Quincey
Ernest Forrestfather1961-09-11Headley Quincey
Flavia Quinceymother1963-02-16Flavia Quincey
Constance Forrestmother1968-09-06Flavia Quincey
Andie Quinceyson1983-06-05Andie Quincey

Отставание от самой высокой зарплаты

MySQL 8.1
SELECT department_id,
	name,
	salary,
	FIRST_VALUE(salary) OVER (
		PARTITION BY department_id
		ORDER BY salary DESC
	) - salary AS gap_to_top
FROM employees;
department_idnamesalarygap_to_top
1Dmitry Sokolov2200000
1Anna Ivanova21000010000
1Igor Petrov19500025000
1Pavel Smirnov18000040000
1Elena Kozlova17500045000
2Irina Volkova2050000
2Olga Novikova2000005000
2Maxim Morozov16000045000
2Nikita Popov16000045000
3Tatiana Lebedeva1700000

Подробности

Рамка по умолчанию начинается с первой строки раздела, поэтому без своей рамки функция возвращает первое значение раздела.

Рамка задаёт, какие строки раздела видит функция, и пишется после ORDER BY: ROWS BETWEEN начало AND конец считает строки, а RANGE BETWEEN начало AND конец — значения ORDER BY.

ГраницаЧто означает
UNBOUNDED PRECEDINGПервая строка раздела
n PRECEDINGn строк до текущей
CURRENT ROWТекущая строка
n FOLLOWINGn строк после текущей
UNBOUNDED FOLLOWINGПоследняя строка раздела

Без рамки действует правило по умолчанию. Если в OVER есть ORDER BY, рамка идёт от начала раздела до текущей строки, включая строки с тем же значением ORDER BY. Если ORDER BY нет, рамка — весь раздел.

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

Где изучить