sql >> Databasteknik >  >> RDS >> Mysql

Ta bort dubbletter baserade på två kolumner och behåll raden som har minsta värde för en annan kolumn

Du kan använda den här frågan för att ta bort alla dubbletter, och lämna den tidigaste:

DELETE d
FROM discog d
JOIN discog d1 ON d1.artist = d.artist AND d1.track = d.track AND d1.year < d.year;

Uppdatera

En alternativ lösning som borde vara effektivare för riktigt stora tabeller är att skapa en kopia med hjälp av ett UNIKT index på raderna för att förhindra dubbelinsättning:

CREATE TABLE discog_copy (id INT, artist VARCHAR(50), track VARCHAR(50), year INT);
ALTER TABLE discog_copy ADD UNIQUE KEY (artist, track);
INSERT IGNORE INTO discog_copy SELECT * FROM discog ORDER BY year;

Den unika nyckeln finns på kombinationen artistnamn och spårnamn och så kommer det att tillåta artister att ha olika spår och olika artister att ha samma spårnamn. Eftersom SELECT en del av frågan har ORDER BY år, kommer den att infoga kombinationen (artist,spår,år) med det lägsta året först och sedan kommer andra identiska (artist, spår)poster inte att infogas på grund av dubblettnyckeln.

Demo på rextester




  1. Prestanda för frågan på indexerad boolesk kolumn vs kolumn Datetime

  2. Hur man skapar PDF-rapporter med PL/SQL

  3. Tidstämpelberäkning med sommartid

  4. Relationellt databashanteringssystem (RDBMS):MSSQL vs MySQL