Создавать номера строк и назначать одинаковые номера строк одним и тем же значениям

У меня есть требование показывать повторяющийся номер строки для повторяющихся значений при каждом новом появлении.

Пример таблицы orders со столбцом AGENT_CODE, и я хочу, чтобы ожидаемый результат был похож на

Sl  agent_code
------------------
1   A001
2   A002
2   A002
2   A002
2   A002
2   A002
2   A002
2   A002
3   A003
3   A003
4   A004
4   A004
4   A004
4   A004
5   A007
5   A007
5   A007
6   A008
6   A008

Мне удалось получить номер строки с последовательностью типа 1,2,3,4 .... 19, написав запрос:

SET @row_number := 0;
SELECT @row_number := @row_number + 1 AS row_number, AGENT_CODE
FROM orders, (SELECT @row_number := 0) t
ORDER BY agent_code

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

Какую версию MySQL вы используете?

Salman A 30.11.2018 11:14

5.2.37 Сервер MySQL

Intact Abode 30.11.2018 11:15

Сначала необходимо выполнить явное упорядочение в производной таблице. Прочтите этот ответ, чтобы понять, почему вы получаете неверные результаты: stackoverflow.com/a/53465139/2469308

Madhur Bhaiya 30.11.2018 11:15
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
3
2 118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно что-то похожее на DENSE_RANK() OVER (ORDER BY AGENT_CODE), для которого требуется MySQL 8+. В более старых версиях вы могли просто сделать это:

SELECT AGENT_CODE, (
    SELECT COUNT(DISTINCT AGENT_CODE) + 1
    FROM orders AS x
    WHERE x.AGENT_CODE < t.AGENT_CODE
) AS sn
FROM orders AS t

PS: если вы хотите использовать пользовательские переменные, вам понадобится еще одна переменная с именем @prevagent.

Разве WHERE x.AGENT_CODE < t.AGENT_CODE не должен быть WHERE x.AGENT_CODE <= t.AGENT_CODE

Ankit Bajpai 30.11.2018 11:18

Нет, я забыл добавить 1 к COUNT(*).

Salman A 30.11.2018 11:19

Привет, @Salman A, похоже, это работает, но как мне начать с 1, потому что ваш результат дает мне от 0.

Intact Abode 30.11.2018 11:19

Другие вопросы по теме