2 Stimmen

Probleme beim Löschen teilweise duplizierter Zeilen

Ich versuche, teilweise doppelte Zeilen zu löschen; Zeilen, bei denen einige Schlüsselwerte gleich sind. Um dies zu tun, muss ich mich zwischen den doppelten Zeilen entscheiden, die basierend auf einer Spalte gelöscht werden sollen.

Zum Beispiel: Datentabelle

col1, col2, col3
1,     1,    1
2,     2,    2
1,     1,    2
2,     2,    3

Ich möchte die Zeilen loswerden, die auf Col 1 und 2 doppelt sind, und die Zeile behalten, die auf Col3 am höchsten ist, sodass folgendes Ergebnis entsteht:

col1, col2, col3
1,     1,    2
2,     2,    3

Ich denke, dass der richtige Weg ist, eine distinct Anweisung auf col 1 und 2 durchzuführen, aber ich habe Schwierigkeiten, col3 in das Ergebnis einzuarbeiten.

SELECT DISTINCT [col1], [col2]  FROM [table]

Irgendwelche Ideen?

1voto

Aleksandr Fedorenko Punkte 15734
LÖSCHEN VON t
AUS dbo.test83 t
WO NICHT EXISTS (
                  SELECT 1
                  FROM dbo.test83 t2
                  WHERE t.Col1 = t2.Col1
                    UND t.Col2 = t2.Col2
                  HAVING MAX(t2.col3) = t.col3
                  )

Demo auf SQLFiddle

Außerdem können Sie in SQLServer2005+ die Option mit CTE und ROW_NUMBER() Ranking-Funktion verwenden

;WITH cte AS
 (      
  SELECT ROW_NUMBER() OVER(PARTITION BY t.Col1, t.Col2 ORDER BY t.Col3 DESC) AS rn
  FROM dbo.test83 t
  )
  DELETE
  FROM cte
  WHERE rn > 1

0voto

Mayukh Roy Punkte 1815

Versuchen Sie, einen UNIQUE INDEX hinzuzufügen, so wie hier:

ALTER IGNORE TABLE Tabellenname ADD UNIQUE INDEX idx_name (Spalte1, Spalte2);

Dadurch werden alle doppelten Zeilen gelöscht und zukünftige doppelte Einfügungen verhindert. Es ist ratsam, vor der Ausführung etwas derartiges zu sichern...

0voto

Jonathan P. Punkte 193

Gibt Ihnen diese Auswahl das gewünschte Ergebnis?

select [col1], [col2], max([col3]) from [table3] group by col1,col2

Vielleicht können Sie das Ergebnis dieser Auswahl in eine Tabelle einfügen und die alte Tabelle durch die neue ersetzen? Ich glaube, dies ist wahrscheinlich nicht die beste Lösung, aber vielleicht kann Ihnen diese Abfrage helfen, das zu finden, wonach Sie suchen.

0voto

Fearghal Punkte 10419

Ich habe es durch einen anderen StackOverflow-Beitrag herausgefunden ...

SELECT * 
FROM [TABLE] a 
     LEFT JOIN [TABLE] a2
         ON a.col3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X