使用 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()
函数中是必需的。
我几乎可以肯定这是不可能的,但我经常对 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()
函数中是必需的。