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.]
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% ROW_NUMBER()
ist dafür großartig:
Sie erwähnen das Entfernen der Duplikate, wenn Sie DELETE
können Sie einfach:
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.
Tags und Links sql sql-server tsql join duplicate-removal