Entfernen von doppelten Zeilen (basierend auf Werten aus mehreren Spalten) aus der SQL-Tabelle

7

Ich habe folgende SQL-Tabelle:

AR_Customer_ShipTo

%Vor%

(ARDivisionNo, CustomerNo,ShipToCode) bilden einen Primärschlüssel für diese Tabelle.

Wenn Sie bemerken, dass die ersten 3 Zeilen zum selben Kunden (Testkunde) gehören, der verschiedene ShipToCodes hat: 1, 2 und 3. Ähnliches gilt für den zweiten Kunden (ARACODE-Kunde). Jeder von Normaler Kunde und Normaler Kunde-2 hat nur einen Datensatz mit einem einzelnen ShipToCode .

Nun möchte ich eine Ergebnisabfrage für diese Tabelle erhalten, wo ich nur einen Datensatz pro Kunde haben werde. Also, für jeden Kunden, wo es mehr als 1 Datensätze gibt, möchte ich den Datensatz mit dem höchsten Wert für ShipToCode behalten.

Ich habe verschiedene Dinge ausprobiert:

(1) Ich kann die Liste der Kunden mit nur einem Datensatz in Tabelle leicht erhalten.

(2) Mit der folgenden Abfrage kann ich die Liste aller Kunden abrufen, die mehr als einen Datensatz in der Tabelle haben.

[Abfrage-1]

%Vor%

(3) Nun, um richtiges ShipToCode für jeden von obiger Abfrage zurückgegebenen Datensatz auszuwählen, kann ich nicht herausfinden, wie ich alle von der obigen Abfrage zurückgegebenen Datensätze durchlaufen soll.

Wenn ich etwas mache wie:

[Abfrage-2]

%Vor%

Dann kann ich den passenden Eintrag für (00-1234567-Testkunde) bekommen. Wenn ich also alle Ergebnisse von Abfrage-1 in der obigen Abfrage (Abfrage-2) verwenden kann, kann ich die gewünschten einzelnen Datensätze für Kunden mit mehr als einem Datensatz abrufen. Dies kann mit den Ergebnissen aus Punkt (1) kombiniert werden, um das gewünschte Endergebnis zu erzielen.

Auch dies kann einfacher sein als der Ansatz, dem ich folge. Bitte lassen Sie mich wissen, wie kann ich das tun.

[Hinweis: Ich muss dies nur mit SQL-Abfragen tun. Ich kann gespeicherte Prozeduren nicht verwenden, da ich dieses Ding schließlich mit 'Scribe Insight' ausführen werde, was mir nur erlaubt, Abfragen zu schreiben.]

    
Vikram 14.05.2015, 17:47
quelle

4 Antworten

14

Beispiel SQL FIDDLE

1) Verwenden Sie CTE, um basierend auf ARDivisionNo, CustomerNo den maximalen Wert für den Schiffscodewert zu erhalten für jeden Kunden

%Vor%

2) Um den Datensatz zu löschen, verwenden Sie Abfrage löschen anstelle von Auswählen und ändern Sie Where Clause in rn & gt; 1. Beispiel SQL FIDDLE

%Vor%     
HaveNoDisplayName 14.05.2015, 18:00
quelle
3

Sie haben die Version von SQL Server nicht angegeben, aber ROW_NUMBER wird wahrscheinlich unterstützt:

%Vor%     
dnoeth 14.05.2015 17:56
quelle
3

ROW_NUMBER() ist dafür großartig:

%Vor%

Sie erwähnen das Entfernen der Duplikate, wenn Sie DELETE können Sie einfach:

%Vor%

Die Funktion ROW_NUMBER() weist jeder Zeile eine Zahl zu. PARTITION BY ist optional, wird aber verwendet, um die Nummerierung für jeden Wert in einem bestimmten Feld oder einer Gruppe von Feldern zu beginnen, dh: wenn Sie PARTITION BY Some_Date , dann beginnt die Nummerierung für jeden eindeutigen Datumswert bei 1. ORDER BY von Kurs wird verwendet, um zu definieren, wie die Zählung gehen soll, und ist in der Funktion ROW_NUMBER() erforderlich.

    
Hart CO 14.05.2015 18:04
quelle
2

Mit row_number Funktion:

%Vor%     
Giorgi Nakeuri 14.05.2015 17:57
quelle