Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

T-SQL:eliminare tutte le righe duplicate ma conservarne una

Non hai specificato quale versione stavi utilizzando, ma in SQL 2005 e versioni successive è possibile utilizzare un'espressione di tabella comune con la clausola OVER. Va un po' come questo:

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

Giocaci e guarda cosa ottieni.

(Modifica:nel tentativo di essere d'aiuto, qualcuno ha modificato il ORDER BY clausola all'interno del CTE. Per essere chiari, puoi ordinare in base a ciò che vuoi qui, non deve essere una delle colonne restituite dal cte. In effetti, un caso d'uso comune qui è che "foo, bar" sono l'identificatore del gruppo e "baz" è una sorta di timestamp. Per tenerti aggiornato, dovresti fare ORDER BY baz desc )