2016-03-26 9 views
2

habe ich diese Tabelle und drei Spalten (ID, E-Mail, [Letztes Update]doppelte Zeilen löschen, aber die früheste Zeile (nach Datum Kriterien) halten - SQL Server

ich doppeln E-Mails gelöscht werden sollen, aber die letzten zu halten. .. aktualisierte Zeile (nach Datum Kriterien) in diesem Beispiel aaa dupliziert Es hat 1 Reihe im Jahr 2011 und andere in 2014 I 2014 nur

ID  Email   Last update   
a-4  aaa   10/01/2011 
b-1  bbb   10/02/2012  
k-1  ccc   05/03/2013  
d-9  aaa   10/08/2014 
t-7  bbb   02/09/2015 
+0

welche sql server verwenden Sie? Orakel? ms SQL? mein sql? –

+0

Ich denke, Register bedeutet eine Aufzeichnung. –

Antwort

1

Verwenden Sie die folgende SQL-Anweisung behalten möchten:

SELECT First(ID) AS Id, First(Email) AS Email, Max([Last update]) AS LastUpd 
FROM YourTable 
GROUP BY Email 
ORDER BY Max([Last update]) DESC; 

und MAKE TABLE bei Notwendigkeit.

1

Sie haben uns nicht gesagt, welche DBMS Sie verwenden, wobei jedoch die folgenden ANSI SQL und sollte auf allen (modern) DBMS arbeiten:

delete from the_table 
where exists (select id 
       from the_table t2 
       where t2.email = the_table.email 
       and t2.id <> the_table.id 
       and t2.last_update > the_table.last_update); 

SQLFiddle: http://sqlfiddle.com/#!15/ca442/1

2

In SQL Server Sie kann CTE verwenden, um die DELETE auszuführen:

;WITH ToDelete AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Email   
          ORDER BY [Last update] DESC) AS rn 
    FROM mytable 
) 
DELETE FROM ToDelete 
WHERE rn > 1 
0

löschen die duplizierten Datensätze für die E-Mail-Feld:

DELETE a FROM MyTable a INNER JOIN (
    SELECT Email, MAX([Last Update]) [Last Update] 
    FROM MyTable 
    GROUP BY Email 
) b ON a.Email = b.Email AND a.[Last Update] <> b.[Last Update];