sql >> Database >  >> RDS >> Sqlserver

T-SQL:alle dubbele rijen verwijderen, maar er één behouden

U hebt niet gezegd welke versie u gebruikte, maar in SQL 2005 en hoger kunt u een algemene tabelexpressie gebruiken met de OVER-clausule. Het gaat een beetje als volgt:

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

Speel ermee en kijk wat je krijgt.

(Bewerken:in een poging om behulpzaam te zijn, heeft iemand de ORDER BY bewerkt clausule binnen de CTE. Voor alle duidelijkheid, je kunt hier bestellen op alles wat je wilt, het hoeft niet een van de kolommen te zijn die door de cte worden geretourneerd. In feite is een veelvoorkomend gebruik hier dat "foo, bar" de groepsidentificatie is en "baz" een soort tijdstempel is. Om op de hoogte te blijven, doet u ORDER BY baz desc )



  1. Dynamische SQL (tabelnaam doorgeven als parameter)

  2. MS Access-gegevens gebruiken in een samenvoegbewerking

  3. Gastgebruiker wachtwoord in 11i/R12

  4. UTC_TIME Voorbeelden – MySQL