Gordon Linoff 关于不订购是正确的,因此不可能完全按照您的要求进行
但是如果你有一个额外的列要在 SQL Server 中排序,你可以使用 DENSE_RANK 来分配数字:
--create table Test(col varchar(100))
--insert into Test values('a'),('a'),('a'),('b'),('b'),('c'),('d')
select col, DENSE_RANK() over (Order BY col)
from Test
它会产生
a 1
a 1
a 1
b 2
b 2
c 3
d 4
或者,总是有一个循环或光标循环选项。此脚本似乎正在产生您的预期结果:
/*
drop table Test
create table Test(ExcelRowId int not null identity primary key, data varchar(100) not null, idx int)
insert into Test(data) values('a'),('a'),('a'),('a'),('a'),('b'),('b'),('b'),('c'),('c'),('a'),('a'),('b'),('b')
*/
declare @idx int, @prev_data varchar(100), @data varchar(100)
set @idx = 0
declare cur cursor for select Data from Test order by ExcelRowId for update of idx
open cur
fetch next from cur into @data
while @@FETCH_STATUS = 0
begin
if @prev_data is null or @data <> @prev_data set @idx = @idx + 1
set @prev_data = @data
update Test set Idx = @Idx WHERE CURRENT OF cur
fetch next from cur into @data
end
close cur
deallocate cur
select * from test