如何对数据进行分组并为每一行写入其组 ID?

Ron*_*Dev 4 t-sql sql-server-2012 rank

我有样本数据:

CREATE TABLE #T (Name varchar(5), GroupId int NULL)
INSERT INTO #T (Name)  VALUES 
('A'),
('A'),
('A'),
('B'),
('B'),
('C'),
('D'),
('D') 

Name  GroupId
----- -----------
A     NULL
A     NULL
A     NULL
B     NULL
B     NULL
C     NULL
D     NULL
D     NULL
Run Code Online (Sandbox Code Playgroud)

如何按名称对数据进行分组,并在其后写入 groupId(顺序,可能是身份)?这就是我想要得到的:

Name  GroupId
----- -----------
A     1
A     1
A     1
B     2
B     2
C     3
D     4
D     4
Run Code Online (Sandbox Code Playgroud)

要分组的表有大约 15m 行。如何更好地做到这一点?谢谢!

Sab*_*n B 6

;WITH cteA
AS(SELECT  Name,GroupID,
        DENSE_RANK () OVER(ORDER BY Name) AS New_GroupID
     FROM #T)


UPDATE  cteA
SET GroupID  = New_GroupID
Run Code Online (Sandbox Code Playgroud)

现在,根据您的系统,这可能需要几秒钟或更长时间。您可以拆分更新,分块进行。类似 AG 的东西,然后从 G 到 M ......你可以在 DENSE_RANK 中添加类似的东西MaxGroupID + DENSE_RANK () OVER(ORDER BY Name) AS New_GroupID