Angenommen, ich habe eine Tabelle mit Kundenadressen:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
In der Tabelle kann ein Kunde wie John Smith mehrere Adressen haben. Ich benötige die Auswahlabfrage für diese Tabelle, um nur die erste gefundene Zeile zurückzugeben, in der Duplikate in 'CName' vorhanden sind. Für diese Tabelle sollten alle Zeilen außer der dritten zurückgegeben werden (oder die erste - jede dieser beiden Adressen ist in Ordnung, aber nur eine kann zurückgegeben werden). Gibt es ein Schlüsselwort, das ich der SELECT-Abfrage hinzufügen kann, um zu filtern, ob der Server den Spaltenwert bereits zuvor gesehen hat?
In SQL 2k5 + können Sie Folgendes tun:
quelle
Sie können verwenden
row_number()
, um die Zeilennummer der Zeile abzurufen. Es verwendet denover
Befehl - diepartition by
Klausel gibt an, wann die Nummerierung neu gestartet werden soll, undorder by
wählt aus, auf welcher Reihenfolge die Zeilennummer angeordnet werden soll. Selbst wenn Sieorder by
am Ende Ihrer Abfrage ein hinzufügen , wird die Reihenfolge imover
Befehl bei der Nummerierung beibehalten .quelle
ROW_NUMBER()
funktioniert nicht inWhere
Klausel in TeradataSie können die
row_numer() over(partition by ...)
Syntax folgendermaßen verwenden:Dies führt dazu, dass eine Spalte mit dem Namen erstellt wird. Hierbei handelt es sich
row
um einen Zähler, der jedes Mal erhöht wird, wenn er dasselbe siehtCName
, und diese Vorkommen nach indiziertAddressLine
. Durch Auferlegenwhere row = 1
kann man alphabetisch auswählen,CName
wessenAddressLine
zuerst kommt. Wenn dasorder by
wardesc
, dann wäre es der Pick ,CName
dasAddressLine
kommt zuletzt in alphabetischer Reihenfolge.quelle
Dadurch erhalten Sie eine Zeile jeder doppelten Zeile. Es gibt Ihnen auch die Spalten vom Bittyp und funktioniert zumindest in MS SQL Server.
Wenn Sie stattdessen alle Duplikate finden möchten, ändern Sie einfach rn = 1 in rn> 1. Ich hoffe, dies hilft
quelle