#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'
(в этом сценарии на ID3
), у вас никогда не будет другого'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