Описание : в этой статье вы узнаете, как эмулировать функцию row_number() в MySQL. Мы покажем вам, как добавить последовательное целое число к каждой строке или группе строк в наборе результатов.
Обратите внимание, что MySQL поддерживает оконную функцию row_number() начиная с версии 8.0. Если вы используете MySQL 8.0 или более позднюю версию, проверьте функцию ROW_NUMBER(). В противном случае вы можете продолжить обучение, чтобы узнать, как эмулировать функцию ROW_NUMBER().
Введение в функцию ROW_NUMBER()
ROW_NUMBER() является функцией окна, которая возвращает порядковый номер для каждой строки, начиная с 1 для первой строки.
До версии 8.0 MySQL не поддерживал такую ROW_NUMBER(), как Microsoft SQL Server, Oracle или PostgreSQL. К счастью, MySQL предоставляет переменные сеанса, которые вы можете использовать для эмуляции функции ROW_NUMBER().
MySQL ROW_NUMBER — добавление номера строки для каждой строки
Чтобы эмулировать функцию ROW_NUMBER(), вы должны использовать переменные сеанса в запросе.
Следующие операторы возвращают пять сотрудников из employeesтаблицы и добавляют номер строки для каждой строки, начиная с 1.
SET@row_number=0; SELECT (@row_number:=@row_number + 1) AS num, firstName, lastName FROM employees ORDER BY firstName, lastName LIMIT 5;
В этом примере:
- Сначала определите именованную переменную @row_number и установите ее значение равным 0. Переменная сеанса @row_number, указанная с префиксом @.
- Затем выберите данные из таблицы employees и увеличьте значение переменной @row_number на единицу для каждой строки. Мы используем предложение LIMIT, чтобы ограничить количество возвращаемых строк до пяти.
Другой метод заключается в использовании переменной сеанса в качестве производной таблицы и перекрестном соединении ее с основной таблицей. Смотрите следующий запрос:
SELECT (@row_number:=@row_number + 1) AS num, firstName, lastName FROM employees, (SELECT @row_number:=0) AS t ORDER BY firstName, lastName LIMIT 5;
Обратите внимание, что производная таблица должна иметь свой собственный псевдоним, чтобы сделать запрос синтаксически правильным.
MySQL ROW_NUMBER- добавление номера строки в каждую группу
Как насчет функциональности ROW_NUMBER() OVER(PARITION BY … )? Например, что делать, если вы хотите добавить номер строки в каждую группу, и он сбрасывается для каждой новой группы.
Давайте посмотрим на таблицу payments из примера базы данных :
SELECT customerNumber, paymentDate, amount FROM payments ORDER BY customerNumber;
Предположим, для каждого клиента вы хотите добавить номер строки, и номер строки сбрасывается при каждом изменении номера клиента.
Чтобы достичь этого, вы должны использовать две переменные сеанса, одну для номера строки, а другую для хранения старого номера клиента, чтобы сравнить ее с текущей в качестве следующего запроса:
set @row_number := 0; SELECT @row_number:=CASE WHEN@customer_no=customerNumber THEN @row_number + 1 ELSE 1 END AS num, @customer_no:=customerNumber customerNumber, paymentDate, amount FROM payments ORDER BY customerNumber;
В этом примере мы используем выражение CASE в запросе. Если номер клиента остается неизменным, мы увеличиваем переменную @row_number, в противном случае мы сбрасываем ее до единицы.
Этот запрос использует производную таблицу и перекрестное соединение для получения одинакового результата.
SELECT
@row_number:=CASE
WHEN@customer_no=customerNumber
THEN
@row_number + 1
ELSE
1
END AS num,
@customer_no:=customerNumber CustomerNumber,
paymentDate,
amount
FROM
payments,
(SELECT @customer_no:=0,@row_number:=0) as t
ORDER BY
customerNumber;
В этой статье вы узнали два способа эмулировать оконную функцию row_number в MySQL.