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

时间:2015-03-13 22:39:17

标签: sql sql-update duplicates

我几乎可以肯定这是不可能的,但我常常对SQL语言的强大感到惊讶,我以为我会问,因为这会节省我数周的工作量

我们假设你有一个这样的表,随机数量的重复记录:

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

'复制'字段是为了使这些记录独特。每次找到新的副本时,重复项需要增加1,以便其他记录可以重复,但重复字段将包含1,2,3 ....等等。

这是我的问题的一个简化示例 - 在包含约30个字段的表格中约有40,000条记录,并且使用“复制”字段必须使16个字段成为唯一的。领域。按照16'唯一性排序它们'当然,田地很容易。但有没有办法告诉SQL更新复制字段,每次发现重复时添加一个?

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

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用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开始。{{1}当然用于定义计数应该如何进行,并且在ORDER BY函数中是必需的。