Fonction pour incrémenter des entiers dans une table

J'ai une instruction de mise à jour où elle reconnaît des valeurs en double dans un champ et pour chacun trouvé je veux incrémenter le time d'une minute dans un champ de date / heure. Je ne peux pas modifier la valeur dupliquée car elle casse d'autres parties du projet.

Mon code est actuellement:

UPDATE table SET Date = GETDATE() Where Seq in (Select Seq from table Group By Seq Having COUNT(Seq) > 1) 

Actuellement, il définit toutes les dates à la même heure. Comment définir la date pour que chacun obtienne une heure unique?

J'ai essayé quelque chose comme:

 SET Date = DATEADD(Mi,1, Date) 

Cela augmente de 1 minute sur tous les loggings. Comment puis-je les toucher tous séparément?

Vous pouvez utiliser ROW_NUMBER dans un CTE :

 WITH CTE AS( SELECT *, rn = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) FROM Seq WHERE Seq IN(SELECT Seq FROM Seq GROUP BY Seq HAVING COUNT(Seq) > 1) ) UPDATE CTE SET Date = DATEADD(MINUTE, rn, GETDATE()) 

Essaye ça:

 UPDATE table SET Date = DATEADD(Mi,1, Date) Where ROWID in (Select MIN(t.ROWID) from table t Group By Seq Having COUNT(Seq) > 1); 

Une autre approche utilisant RANK et ROW_NUMBER pour dériver le nombre de minutes à append à chaque date dans le groupe (si j'ai correctement interprété votre question).

Devrait fonctionner en 2012 (vous ne mentionnez pas la version de SQL Server que vous utilisez)

 CREATE TABLE #Seq(seq INT,date DATETIME2); DECLARE @Now DATETIME2 = SYSDATETIME(); INSERT INTO #Seq ( seq, date ) VALUES (0, DATEADD(MINUTE, 1, @Now)) ,(0, DATEADD(MINUTE, 2, @Now)) ,(0, DATEADD(MINUTE, 3, @Now)) ,(1, DATEADD(MINUTE, 10, @Now)) ,(1, DATEADD(MINUTE, 10, @Now)) ,(1, DATEADD(MINUTE, 10, @Now)) ,(2, DATEADD(MINUTE, 20, @Now)) ,(2, DATEADD(MINUTE, 21, @Now)) ,(2, DATEADD(MINUTE, 22, @Now)); SELECT * FROM #Seq; WITH CTE AS( SELECT SEQ ,Date ,ROW_NUMBER() OVER (PARTITION BY seq ORDER BY Date) rn ,RANK() OVER (PARTITION BY seq ORDER BY Date) rnk FROM #seq ) UPDATE CTE SET Date = DATEADD(MINUTE, (rn-rnk), Date); SELECT * FROM #Seq;