Попробуйте это:
SELECT
ID,
InstanceNumber = Row_Number() OVER (ORDER BY InstanceNumber),
IsArchived
FROM @tbl
WHERE IsArchived = 0
Однако один вопрос: что если в заархивированных данных будет пробел?
INSERT INTO @tbl VALUES (5000, 1, 1)
INSERT INTO @tbl VALUES (8347, 2, 0)
INSERT INTO @tbl VALUES (9343, 3, 1)
INSERT INTO @tbl VALUES (11048, 4, 0)
Какие результаты вы хотите получить в этом случае?Ваш текущий запрос дает InstanceNumber как -1 и 1. Мой запрос выше дает InstanceNumber 1 и 2. Другой возможный ответ - вернуть InstanceNumber 1 и 3 (представляющий шаг InstanceNumber, равный 2 между 8347 и 11048).
Обновление
Так что, если я правильно понимаю, о возможности пробелов, вам нужно изменить свой запрос для обработки следующего случая:
INSERT INTO @tbl VALUES (5000, 1, 1)
INSERT INTO @tbl VALUES (8347, 2, 1)
INSERT INTO @tbl VALUES (9343, 4, 0)
INSERT INTO @tbl VALUES (11048, 5, 0)
SELECT
ID,
NewInstanceNumber = InstanceNumber + 1
- (SELECT Min(InstanceNumber) FROM @tbl WHERE IsArchived = 0),
IsArchived
FROM @tbl
WHERE IsArchived = 0
, чтобынумерация всегда начинается с 1. Вы также можете попробовать это:
SELECT
ID,
NewInstanceNumber = InstanceNumber + 1 - Min(InstanceNumber) OVER (),
IsArchived
FROM @tbl
WHERE IsArchived = 0
Но я не знаю, будет ли это лучше или хуже, чем ваш текущий запрос.