我有一个大约有1000万行(和20列 - 大约4 GB)的数据库,其中大约10%的行具有重复的列。数据库位于SQL Server 2014 Express中并使用SSMS。
我创建了一个新列CNT(int,null)来计算我有重复ID的每一行的出现次数。期望的结果看起来像:
ID CNT
100 1
100 2
101 1
102 1
102 2
103 1
104 1
不熟悉高级SQL功能我做了一些研究,并提出使用CTE设置CNT列。在一个小型测试台上工作得很好 - 但显然这不是一个大桌子的方法(我在一个相当不错的系统上杀了5个多小时后就杀了它。)
以下是我尝试实施的代码:
with CTE as
(select dbo.database.id, dbo.database.cnt,
RN = row_number() over (partition by id order by id)
from dbo.databasee)
update CTE set CNT = RN
列ID的类型为Int。所有列都允许空值 - 没有键或索引列。
答案 0 :(得分:2)
编辑:马丁是对的,我现在只能提供比CTE更多的替代解决方案。创建一个与旧表完全相同的新表,并将旧表的数据插入其中。
INSERT INTO newTable
SELECT ID, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID)
FROM oldTable;
然后你可以删除你的旧表。绝对不是一个完美的解决方案,但它应该有效。