Люди не могли бы жить, если бы боги не дали бы им дара забвения (Еврипид).

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

2 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
16 января 2020
Как скопировать базу данных 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 … )? Например, что делать, если вы хотите добавить номер строки в каждую группу, и он сбрасывается для каждой новой группы.

Читать  MySQL Shell 8.0.20. Что нового?

Давайте посмотрим на таблицу 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.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close