Disons que j'ai un tableau des adresses clients:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
Dans le tableau, un client comme John Smith peut avoir plusieurs adresses. J'ai besoin de la requête de sélection pour cette table pour renvoyer uniquement la première ligne trouvée où il y a des doublons dans «CName». Pour cette table, il doit renvoyer toutes les lignes sauf la 3e (ou la 1ère - n'importe laquelle de ces deux adresses est correcte mais une seule peut être renvoyée). Existe-t-il un mot-clé que je peux ajouter à la requête SELECT pour filtrer en fonction du fait que le serveur a déjà vu la valeur de la colonne auparavant?
Dans SQL 2k5 +, vous pouvez faire quelque chose comme:
la source
Vous pouvez utiliser
row_number()
pour obtenir le numéro de ligne de la ligne. Il utilise laover
commande - lapartition by
clause spécifie quand redémarrer la numérotation etorder by
sélectionne sur quoi ordonner le numéro de ligne. Même si vous avez ajouté unorder by
à la fin de votre requête, cela conserverait l'ordre dans laover
commande lors de la numérotation.la source
ROW_NUMBER()
ne fonctionne pas non plus enWhere
clause dans TeradataVous pouvez utiliser la
row_numer() over(partition by ...)
syntaxe comme ceci:Cela crée une colonne appelée
row
, qui est un compteur qui s'incrémente à chaque fois qu'il voit la même choseCName
et indexe ces occurrences parAddressLine
. En imposantwhere row = 1
, on peut sélectionner celuiCName
quiAddressLine
vient en premier par ordre alphabétique. Si l'order by
étaitdesc
, alors il choisirait leCName
dontAddressLine
vient en dernier par ordre alphabétique.la source
Cela vous donnera une ligne de chaque ligne en double. Il vous donnera également les colonnes de type bit, et cela fonctionne au moins dans MS Sql Server.
Si vous voulez trouver tous les doublons à la place, changez simplement le rn = 1 en rn> 1. J'espère que cela vous aidera
la source