Предположим, что таблица называется «Цвета» с полями ID
, Color
и ColorIndex
типов int
, varchar
и int
соответственно.Я также предполагаю, что OP означает prev / after, основываясь на упорядочении поля ID
в порядке asc
.
Вы можете сделать это без курсора и использовать цикл while ... но это определенноне устанавливается на основании:
DECLARE @MyID int
DECLARE @CurrentIndex int
DECLARE @CurrentColor varchar(50)
DECLARE @PreviousColor varchar(50)
SET @CurrentIndex = (SELECT 0)
SET @MyID = (SELECT TOP 1 ID FROM Colors ORDER BY ID ASC)
SET @CurrentColor = (SELECT '')
SET @PreviousColor = (SELECT Color FROM Colors WHERE ID = @MyID)
WHILE (@MyID IS NOT NULL)
BEGIN
IF (@CurrentColor <> @PreviousColor)
BEGIN
SET @PreviousColor = (SELECT Color FROM Colors WHERE ID = @MyID)
SET @CurrentIndex = (SELECT @CurrentIndex + 1)
UPDATE Colors SET ColorIndex = @CurrentIndex WHERE ID = @MyID
END
ELSE
BEGIN
UPDATE Colors SET ColorIndex = @CurrentIndex WHERE ID = @MyID
SET @PreviousColor = (SELECT Color FROM Colors WHERE ID = @MyID)
END
SET @MyID = (SELECT TOP 1 ID FROM Colors WHERE ID > @MyID ORDER BY ID ASC)
SET @CurrentColor = (SELECT Color FROM Colors WHERE ID = @MyID)
END
Результат после выполнения:
Производительность не была слишком плохой, пока индексируются идентификатор и цвет.Плюс в том, что он немного быстрее обычного старого КУРСОРА и не такой злой.Решение поддерживает SQL 2000, 2005 и 2008 (если вы используете SQL 2000, который не поддерживает CTE).