ROW_NUMBER, вот как вы его эмулируете в MySQL

Описание : в этой статье вы узнаете, как эмулировать функцию 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 из примера базы данных :

ROW_NUMBER, вот как вы его эмулируете в MySQL

 

SELECT

customerNumber,

paymentDate,

amount

FROM

payments

ORDER BY

customerNumber;

 

 

ROW_NUMBER, вот как вы его эмулируете в MySQL

 

Предположим, для каждого клиента вы хотите добавить номер строки, и номер строки сбрасывается при каждом изменении номера клиента.

Чтобы достичь этого, вы должны использовать две переменные сеанса, одну для номера строки, а другую для хранения старого номера клиента, чтобы сравнить ее с текущей в качестве следующего запроса:

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;

 

 

ROW_NUMBER, вот как вы его эмулируете в MySQL

 

В этом примере мы используем выражение 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.



2020-01-16T13:17:29
База данных MySQL