T-SQL修复表中的重复数据

时间:2015-04-20 23:10:34

标签: sql sql-server tsql

下表代表一组干净的数据。请注意,对于每个项目,Priority值是一个介于1和该项目出现次数之间的唯一整数:

ItemKey    ItemName  Priority  
1           Item1      1      
2           Item1      2      
3           Item1      3      
4           Item2      1      
5           Item3      1 
6           Item3      2
7           Item4      1
8           Item4      2

不幸的是,我们的应用程序中存在一个错误,导致某些项目的优先级重复。例如。在下表中,Item1和Item4都有重复的优先级。

ItemKey    ItemName  Priority  
1           Item1      1      
2           Item1      1      
3           Item1      2      
4           Item2      1      
5           Item3      1 
6           Item3      2
7           Item4      1
8           Item4      1

对于如何编写T-SQL脚本来清理上述数据,我将不胜感激。脚本应确定具有重复优先级的项目,并更新违规项目的优先级,以使它们对该项目是唯一的,并且值介于1和项目出现次数之间。清理数据后,行数应保持不变。

我只有PL / SQL经验,所以不确定使用T-SQL实现这一点的最佳方法是什么。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使用窗口功能:

;with cte as(
select *, row_number() over(partition by ItemName order by ItemKey) as rn from Table)
update cte set Priority = rn

答案 1 :(得分:2)

在您的特定示例中,优先级与ItemKey直接相关。如果不是这种情况,更通用的方法是:

with toupdate as (
      select t.*,
             row_number() over (partition by ItemName
                                order by Priority, ItemKey
                               ) as new_priority
      from table t
     )
update toupdate
    set priority = newpriority
    where priority <> newpriority;