下表代表一组干净的数据。请注意,对于每个项目,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实现这一点的最佳方法是什么。
感谢您的帮助。
答案 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;