Suppression des duplicates de la table SQL Server

J'ai une situation dans ma table SQL Server où j'ai de nombreux duplicates d'loggings comme suit:

SID Username InQueue ------------------------------------------------------------------ 162 peeeer2 492 2017-01-18 12:20:21.820 0 354 2791 peeeer2 460 2017-01-11 00:00:00.000 1 NULL 

L'logging indésirable ici est l'user peeeer2 pour lequel j'ai défini InQueue = true . J'ai besoin de supprimer tous ces duplicates où la colonne InQueue est définie sur 1 et l'autre critère est que ce nom d'user est en fait un doublon …

Le nom de la table est SearchedUsernames :

 delete from SearchedUsernames where Username ?? 

Est-ce que quelqu'un peut m'aider avec ça ?

Modifier:

@ TimSchmelter ty tellement, cela fonctionne comme un charme. Je reçois toujours une erreur cependant. Je dois d'abord laisser tomber les FK voisins de cette table. Par exemple quand j'ai un logging FK correspondant dans la table voisine appelée UserTransactions comme suit:

  ID SID ---------------- 162 162 2791 2791 

Je dois d'abord supprimer tous les loggings dans cette table voisine, puis supprimer les duplicates en utilisant votre requête que vous avez écrite. Cependant, cette fois, je voudrais laisser tomber seulement ceux qui ont des loggings en double et ont défini InQueue = 0;

Donc, le scénario ressemblerait à ceci:

  1. Supprimez le SID des loggings FK des deux duplicates dans la table UserTransactions voisine

  2. Ensuite, exécutez la requête que DTV et Tim ont écrite avec une modification mineure pour supprimer uniquement les loggings qui sont en double et ont défini InQueue = 0;

 WITH cte AS ( SELECT Username, inqueue, ROW_NUMBER() OVER (PARTITION BY Username ORDER BY InQueue ASC) AS RN FROM searchedUsernames ) DELETE FROM cte WHERE RN > 1; 

Si vous avez peur de plus d'un Inqueue = 0, alors utilisez RANK

 WITH cte AS ( SELECT Username, inqueue, RANK() OVER (PARTITION BY Username ORDER BY InQueue ASC) AS RN FROM searchedUsernames ) DELETE FROM cte WHERE RN > 1; 

Probablement la solution la plus intuitive serait:

 delete s from SearchedUsernames s where InQueue = 1 and exists(select * from SearchedUsernames where InQueue = 0 and Username = s.Username) 

Vous pouvez utiliser une auto-jointure comme ceci:

  DELETE t0 FROM SearchedUsernames t0 INNER JOIN SearchedUsernames t1 ON(t0.Username = t1.Username AND t0.IsQueue <> T1.IsQueue) WHERE AND t0.IsQueue = 1