Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

T-SQL :supprimer toutes les lignes en double mais en conserver une

Vous n'avez pas précisé la version que vous utilisiez, mais dans SQL 2005 et versions ultérieures, vous pouvez utiliser une expression de table commune avec la clause OVER. Cela ressemble un peu à ceci :

WITH cte AS (
  SELECT[foo], [bar], 
     row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn]
  FROM TABLE
)
DELETE cte WHERE [rn] > 1

Jouez avec et voyez ce que vous obtenez.

(Modifier :dans le but d'être utile, quelqu'un a modifié le ORDER BY clause au sein du CTE. Pour être clair, vous pouvez trier par tout ce que vous voulez ici, il n'est pas nécessaire que ce soit l'une des colonnes renvoyées par le cte. En fait, un cas d'utilisation courant ici est que "foo, bar" est l'identifiant du groupe et "baz" est une sorte d'horodatage. Afin de garder la dernière version, vous feriez ORDER BY baz desc )