En supprimant les doublons (basé sur les valeurs de plusieurs colonnes) de la table SQL
J'ai suivantes table SQL:
AR_Customer_ShipTo
+--------------+------------+-------------------+------------+
| ARDivisionNo | CustomerNo | CustomerName | ShipToCode |
+--------------+------------+-------------------+------------+
| 00 | 1234567 | Test Customer | 1 |
| 00 | 1234567 | Test Customer | 2 |
| 00 | 1234567 | Test Customer | 3 |
| 00 | ARACODE | ARACODE Customer | 1 |
| 00 | ARACODE | ARACODE Customer | 2 |
| 01 | CBE1EX | Normal Customer | 1 |
| 02 | ZOCDOC | Normal Customer-2 | 1 |
+--------------+------------+-------------------+------------+
(ARDivisionNo, CustomerNo,ShipToCode)
forme d'une clé primaire de cette table.
Si vous remarquez des 3 premières lignes appartiennent à un même client (Test à la Clientèle), qui a différents ShipToCodes: 1, 2 et 3. Similaires est le cas avec le deuxième client (ARACODE Client). Chaque Client Normal et Normal à la Clientèle-2 a seulement 1 enregistrement avec une seule ShipToCode
.
Maintenant, je voudrais obtenir un résultat de l'interrogation sur cette table, où je vais avoir 1 seul enregistrement par le client. Donc, pour tout client, où il y a plus de 1 enregistrements, je tiens à garder l'enregistrement avec la valeur la plus élevée pour ShipToCode
.
J'ai essayé plusieurs choses:
(1), je peux facilement obtenir la liste des clients avec un seul enregistrement dans la table.
(2) Avec la requête suivante, je suis en mesure d'obtenir la liste de tous les clients, qui ont plus d'un enregistrement dans la table.
[Requête 1]
SELECT ARDivisionNo, CustomerNo
FROM AR_Customer_ShipTo
GROUP BY ARDivisionNo, CustomerNo
HAVING COUNT(*) > 1;
(3) Maintenant, afin de choisir la bonne ShipToCode
pour chaque enregistrement retourné par la requête ci-dessus, je ne suis pas en mesure de comprendre, comment parcourir tous les enregistrements renvoyés par la requête ci-dessus.
Si je fais quelque chose comme:
[Requête-2]
SELECT TOP 1 ARDivisionNo, CustomerNo, CustomerName, ShipToCode
FROM AR_Customer_ShipTo
WHERE ARDivisionNo = '00' and CustomerNo = '1234567'
ORDER BY ShipToCode DESC
Alors je peut obtenir l'enregistrement approprié pour (00-1234567-Test à la Clientèle). Donc, si je peux utiliser tous les résultats de la requête-1 dans la requête ci-dessus (requête-2), alors je peux obtenir les enregistrements unique pour les clients avec plus d'un enregistrement. Ceci peut être combiné avec des résultats à partir du point (1) pour obtenir le résultat final souhaité.
Encore une fois, cela peut être plus facile que l'approche que je suis. S'il vous plaît laissez-moi savoir comment je peux faire cela.
[Note: je dois faire cela à l'aide de requêtes SQL. Je ne peux pas utiliser des procédures stockées, des que je vais pour l'exécution de cette chose, enfin, à l'aide de "Scribe Insight", qui ne me permet d'écrire des requêtes.]
OriginalL'auteur Vikram | 2015-05-14
Vous devez vous connecter pour publier un commentaire.
Exemple de SQL VIOLON
1) Utilisation CTE pour obtenir un max de navire valeur de code d'enregistrement basé sur ARDivisionNo, Numclient
pour chaque Clients
2) Pour Supprimer l'enregistrement, utilisez la touche Supprimer de la requête, au lieu de Sélectionner et de modifier la Clause where de rn > 1. Exemple de SQL VIOLON
Toutes les autres réponses upvoted par moi (et mon commentaire ci-dessous) m'a aidé et a résolu mon problème. Je suis ce marquage comme une réponse, Piyush a pris l'effort de créer et de poster SQL Exemple des VIOLONS. Je souhaite que je pourrais avoir marqué et d'autres aussi comme une réponse (ou au moins un par Hart CO avec explication), mais stackoverflow me laisse uniquement choisir une!
Merci..Vikram...Espérons que vous pouvez obtenir votre problème résolu!! J'ai également aimé le @Hart CO :- explication
Oui...Merci beaucoup à vous les gars!!! 🙂 🙂 🙂 🙂
OriginalL'auteur HaveNoDisplayName
Vous n'avez pas à spécifier la version de SQL Server, mais ROW_NUMBER est probablement pris en charge:
OriginalL'auteur dnoeth
ROW_NUMBER()
est excellent pour cela:Vous mentionnez en supprimant les doublons, si vous voulez
DELETE
vous pouvez tout simplement:Le
ROW_NUMBER()
fonction attribue un numéro à chaque ligne.PARTITION BY
est facultative, mais est utilisé pour démarrer la numérotation de plus, pour chaque valeur dans un champ ou un groupe de champs, c'est à dire: si vousPARTITION BY Some_Date
puis pour chaque valeur à la date de la numérotation de recommencer à 1.ORDER BY
de cours est utilisé pour définir la façon dont le dépouillement devrait aller, et est nécessaire dans laROW_NUMBER()
fonction.Un peu de correction: Il doit être
partition by ARDivisionNo, CustomerNo
et paspartition by CustomerNo
pour mon exemple particulier dans la question que j'ai demandé.Mis à jour en conséquence.,
OriginalL'auteur Hart CO
Avec
row_number
fonction:Un peu de correction: Il doit être
partition by ARDivisionNo, CustomerNo
et paspartition by CustomerNo
pour mon exemple particulier dans la question que j'ai demandé.OriginalL'auteur Giorgi Nakeuri