使用 tSQL 根据其他值顺序递增值

Use tSQL to sequentially increment value based on other values

我几乎可以肯定这是不可能的,但我经常对 SQL 语言的力量感到惊讶,我只是想问问,因为这可以节省我数周的工作时间.

假设您有一个像这样的 table,重复记录的随机数:

First   Last    Title   Grade   Replicate
Mike    Smith   Manager 2          1
Jenn    Jones   Sales   1          1
Bill    Bennett CEO 2   1          1
Jeff    Miller  Sales   4          1
Harry   James   Manager 6          1
Beth    Samuals Dock    1          1
Cathy   Gordon  Sales   2          1
Bill    Bennett CEO 2   1          1
Jeff    Miller  Sales   4          1
Harry   James   Manager 6          1
Beth    Samuals Dock    1          1
Cathy   Gordon  Sales   2          1
Bill    Bennett CEO 2   1          1
Jeff    Miller  Sales   4          1
Harry   James   Manager 6          1
Jeff    Miller  Sales   4          1
Harry   James   Manager 6          1

'Replicate' 字段用于使这些记录唯一。每次找到新的重复项时,重复项需要递增 1,以便可以复制其他记录,但 Replicate 字段将包含 1、2、3.... 等等。

这是我的问题的一个简化示例 - table 中大约有 40,000 条记录,其中有大约 30 个字段,其中 16 个字段必须使用 'Replicate' 字段使其唯一。当然,在 16 'uniqueness' 个字段中对它们进行排序很容易。但是有什么方法可以告诉 SQL 更新 Replicate 字段,每次发现重复项时添加一个?

正如我所说,我怀疑这是不可能的,或者如果是的话,解决方案超出了我的技能水平,但我以前错了。

谢谢。

您可以为此使用 ROW_NUMBER()

;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY [First],[Last],[Title],[Grade] ORDER BY Replicate) AS UPD_Replicate
              FROM Table1
              )
SELECT *
FROM cte

演示:SQL Fiddle

UPDATE字段:

;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY [First],[Last],[Title],[Grade] ORDER BY Replicate) AS UPD_Replicate
              FROM Table1
              )
UPDATE cte
SET Replicate = UPD_Replicate

ROW_NUMBER() 函数为每一行分配一个数字。 PARTITION BY 是可选的,但用于为给定组中的每个值重新开始编号,即:如果您 PARTITION BY Some_Date 那么对于每个唯一日期值,编号将从 1 开始。ORDER BY 当然用于定义计数应该如何进行,并且在 ROW_NUMBER() 函数中是必需的。