Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

T-SQL:usuwanie wszystkich zduplikowanych wierszy, ale zachowanie jednego

Nie powiedziałeś, jakiej wersji używasz, ale w SQL 2005 i nowszych wersjach możesz użyć wspólnego wyrażenia tabelowego z klauzulą ​​OVER. To wygląda mniej więcej tak:

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

Pobaw się nim i zobacz, co otrzymasz.

(Edytuj:chcąc być pomocnym, ktoś zmodyfikował ORDER BY klauzuli w CTE. Żeby było jasne, możesz tutaj zamówić według czego chcesz, nie musi to być jedna z kolumn zwracanych przez cte. W rzeczywistości częstym przypadkiem użycia jest tutaj to, że „foo, bar” to identyfikator grupy, a „baz” to swego rodzaju znacznik czasu. Aby zachować najświeższe informacje, wykonaj ORDER BY baz desc )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można rozwiązać konfliktu sortowania między SQL_Latin1_General_CP1_CI_AS i Latin1_General_CI_AS w operacji równej

  2. Zmiana sortowania SQL Server na bez uwzględniania wielkości liter z rozróżniania wielkości liter?

  3. SQL MAX wielu kolumn?

  4. SQL Server:dynamiczny przestaw na 5 kolumn

  5. SELECT DISTINCT ignoruje różne przypadki