2017-12-01 3 views
0

Ich bin relativ neu in SQL und konnte nicht finden, was ich falsch mache. Ich versuche, Zeilen mit übereinstimmenden Feldern in 2 bestimmten Spalten mit anderen Zeilen in derselben Tabelle für eine temporäre Tabelle zu löschen, so dass nur eine Zeile mit der gleichen ID und dem gleichen Jahr zurückbleibt, so dass die verbleibende Zeile die mit der ist MAX-Datum für diese IDs in diesem Jahr.SQL-Zeilen werden nicht aus der Tabelle gelöscht, wenn sie nicht vorhanden sind, und wählen unterschiedliche Unterabfragen

My table: 
ID     Year     Date 
---------------------------------------------------- 
1     2017     01/05/2017 
1     2017     11/17/2017 
1     2017     08/07/2017 
1     2016     03/22/2017 
1     2016     04/01/2017 
2     2017     03/12/2017 
2     2016     02/03/2016 
2     2016     04/19/2016 

Wunschergebnisse:

ID     Year     Date 
---------------------------------------------------- 
1     2017     11/17/2017 
1     2016     04/01/2016 
2     2017     03/12/2017 
2     2016     04/19/2016 

Was ich habe:

DELETE FROM #Temp 
WHERE NOT EXISTS (
     SELECT DISTINCT 
       t1.ID, 
       t1.Year 
     FROM #Temp AS t1, 
      #Temp AS t2 
     WHERE t1.ID = t2.ID 
     AND t1.Year <> t2.Year 
     GROUP BY t1.ID, t1.Year) 

Wenn ich es laufen, wird nichts gelöscht, aber wenn ich die ersten beiden Zeilen zu testen, zu entfernen, was gelöscht werden würde , die Ergebnisse sind korrekt, also bin ich wirklich verwirrt. Ich arbeite an der MAX-Funktion, möchte aber, dass dieser Teil zuerst funktioniert.

Jede Hilfe würde sehr geschätzt werden! Ich habe keine Ahnung, was daran falsch sein könnte.

+1

ich den MySQL-Tag entfernt habe, weil es aussieht wie Sie SQL-Server verwenden. Basiert auf der Verwendung der Syntax #table. –

+0

Ihre exisives-Klausel ist nicht mit der äußeren Abfrage korreliert - sie gibt immer Zeilen zurück und daher ist "nicht vorhanden" immer falsch. Im Allgemeinen ist die Verwendung von "distinct" oft ein Hinweis darauf, dass die Abfrage logisch fehlerhaft ist. Hier dient es überhaupt keinem Zweck. Wie die anderen geschrieben haben, lernen Sie, Fensterfunktionen zu verwenden. – SMor

Antwort

0

eine andere Art und Weise ist row_number() Funktion zu verwenden, um die doppelte Datensätze auf ID Basis zu finden .. Year

delete t from 
(
    select *, row_number() over (partition by ID, [Year] order by date desc) rn from <table> 
) t where t.rn > 1 
+0

Danke !! Das hat perfekt funktioniert! Ich bin mir immer noch nicht sicher, warum meine nicht funktionierte, aber jetzt weiß ich über Partitionen und Zeilennummern. – LillyBran

0
with cte as 
(
    select row_number() over (partition by ID, Year order by date desc) as rn 
) 
delete * from cte where rn > 1; 
Verwandte Themen