Добавление и обновление столбца с последовательной нумерацией на основе группировки

#sql #sql-server #tsql #sql-order-by

#sql #sql-сервер #tsql #sql-order-by

Вопрос:

У меня есть таблица со следующей структурой

ID Разделение Подробные сведения
1 A некоторый текст
2 A некоторый текст
3 B некоторый текст
4 B некоторый текст
5 B некоторый текст

Мне нужно добавить новый столбец целочисленного типа с именем «Порядок» с некоторыми данными, как описано ниже:

ID Разделение Подробные сведения Порядок
1 A некоторый текст 1
2 A некоторый текст 2
3 B некоторый текст 1
4 B некоторый текст 2
5 B некоторый текст 3

Как мы можем видеть, целочисленные данные в последовательности столбцов «Порядок» должны быть сброшены, если данные «Деления» изменяются. В таблице тысячи строк с более чем 100 различными подразделениями.

Как я могу этого добиться?

Комментарии:

1. Что произойдет, если 'B' изменения вернутся к 'A' ?

2. @Larnu, я не уверен, что это значит. Но после обновления не должно быть никаких изменений в данных исходного столбца (Id, Division, Details).

3. Значит, как только Разделение изменится на 'B' (в этом сценарии на ID 3 ), у вас никогда не будет другого 'A' ? Итак, что вы делаете 'Z' , что будет после?

4. Да, у меня могла бы быть еще одна пятерка. После «Z» может быть «A1», «B1″… (Кстати, это не точные имена столбцов, данные, которые я использую в проекте. Приведенный выше пример приведен только для удобства понимания.)

Ответ №1:

Вы можете использовать row_number() :

 select t.*, 
    row_number() over(partition by division order by id) rn
from mytable t
 

Комментарии:

1. Спасибо. Чтобы заставить его работать, используя следующий скрипт, обновите t установите t.Order=t.rn из (выберите mytable .*, row_number() поверх (разделение по порядку деления по идентификатору) rn из mytable ) t