sql >> Databáze >  >> RDS >> Sqlserver

T-SQL:Odstranění všech duplicitních řádků, ale ponechání jednoho

Neřekli jste, jakou verzi používáte, ale v SQL 2005 a vyšších můžete použít běžný tabulkový výraz s klauzulí OVER. Funguje to trochu takto:

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

Pohrajte si s tím a uvidíte, co získáte.

(Upravit:Ve snaze být užitečný někdo upravil ORDER BY doložka v rámci CTE. Aby bylo jasno, zde můžete objednávat podle čeho chcete, nemusí to být jeden ze sloupců vrácených CTE. Ve skutečnosti je zde běžným případem použití, že „foo, bar“ je identifikátor skupiny a „baz“ je nějaký druh časového razítka. Chcete-li zachovat nejnovější, proveďte ORDER BY baz desc )



  1. MariaDB LOCALTIME() Vysvětleno

  2. Hlášení využití možností databáze/balíčků

  3. Jak zkopíruji databázi SQL Azure na svůj místní vývojový server?

  4. 4 způsoby, jak najít řádky, které obsahují velká písmena v PostgreSQL