sql >> Databasteknik >  >> RDS >> Sqlserver

T-SQL:Tar bort alla dubbletter av rader men behåller en

Du sa inte vilken version du använde, men i SQL 2005 och senare kan du använda ett vanligt tabelluttryck med OVER-satsen. Det ser ut ungefär så här:

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

Lek med det och se vad du får.

(Redigering:I ett försök att vara till hjälp redigerade någon ORDER BY klausul inom CTE. För att vara tydlig kan du beställa efter vad du vill här, det behöver inte vara en av kolumnerna som returneras av cte. Faktum är att ett vanligt användningsfall här är att "foo, bar" är gruppidentifieraren och "baz" är någon slags tidsstämpel. För att behålla det senaste, gör du ORDER BY baz desc )



  1. Flera fördröjda replikeringsslavar för katastrofåterställning med låg RTO

  2. SQLite MAX

  3. Hur får man mysqli att kasta undantag med MYSQLI_REPORT_STRICT?

  4. MySQL Update Inner Join-tabeller fråga