L'Instruction SQL d'Aide - Sélectionnez la dernière Commande de chaque Client
Dire que j'ai 2 tables: Clients et des Commandes. Un Client peut avoir plusieurs Commandes.
Maintenant, j'ai besoin de montrer tous les Clients avec son dernier Ordre. Cela signifie que si un Client a plus que l'on commande, montrent que l'Ordre avec la dernière Heure d'Entrée.
C'est dans quelle mesure j'ai réussi sur mon propre:
SELECT a.*, b.Id
FROM Customer a INNER JOIN Order b ON b.CustomerID = a.Id
ORDER BY b.EntryTime DESC
Bien sûr, cela renvoie tous les Clients avec un ou plusieurs Ordres, montrant les dernières Ordre d'abord, pour chaque Client, ce qui n'est pas ce que je voulais. Mon esprit a été coincé dans une ornière, à ce moment-là, j'espère que quelqu'un peut me pointer dans la bonne direction.
Pour une raison quelconque, j' pense - je besoin pour utiliser le MAX de syntaxe quelque part, mais il m'échappe en ce moment.
mise à JOUR: Après avoir traversé quelques réponses ici (il y en a beaucoup!), J'ai réalisé que j'ai fait une erreur: je voulais dire tous Client avec son dernier album. Cela signifie que si il n'a pas un Ordre, alors je n'ai pas besoin de lui la liste.
UPDATE2: le Fixe de ma propre instruction SQL, ce qui a probablement causé de la confusion pour les autres.
Oui, implicite dans le SQL.
Si votre table Client dispose d'un n ° de commande votre question n'a aucun sens. Si c'était vrai, vous est-à-dire que chaque commande a un autre client. Êtes-vous sûr que votre Commande de table ne possède pas de code client?
aïe, vous avez raison! L'homme, Mon esprit est vraiment hors de lui aujourd'hui. :/
OriginalL'auteur alextansc | 2008-12-01
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous voulez utiliser (MAX) que vous ne voulez pas le groupe le n ° de commande. Ce que vous avez besoin est un commandés sous-requête avec un SELECT TOP 1.
J'ai fait la commande au début, puis j'ai confondu moi-même et pensais que tu voulais le plus ancien ordre. J'ai maintenant updatd mon exemple correct.
OriginalL'auteur Martin Brown
Alors que je vois que vous avez déjà accepté une réponse, je pense que celui-ci est un peu plus intuitive:
J'aurais à exécuter quelque chose comme ceci par le biais d'un plan d'exécution pour voir la différence dans l'exécution, mais dont la première fonction est effectuée après le fait et que l'utilisation de "order by" peut être cher, je crois que l'utilisation de max(EntryTime) serait la meilleure façon de l'exécuter.
Sûrement que la sous-requête est là que la clause doit être CustomerId = un.Id?
OriginalL'auteur Patrick Harrington
Quelque chose comme ça devrait le faire:
Cela suppose que les deux commandes pour le même client peut avoir le même EntryTime, c'est pourquoi
MAX(OrderID)
est utilisé dans la sous-requêteY
pour s'assurer qu'il ne se produit qu'une seule fois par client. LeLEFT JOIN
est utilisé parce que vous avez dit que vous vouliez afficher tous les clients si ils n'ont pas de toutes les commandes, puis la LatestOrderId seraNULL
.Espérons que cette aide!
--
Mise à JOUR 🙂 Cela montre seulement des clients avec des commandes:
C'est la meilleure solution car il calcule toutes les données nécessaires à l'avant plutôt qu'individuellement, en corrélation des dossiers.
OriginalL'auteur xahtep
Vous pouvez utiliser une fonction de fenêtre.
Pour chaque client (un.id) il trie toutes les commandes et les rejets de tout, mais plus tard.
Clause ORDER BY comprend à la fois la date de commande et l'id d'entrée, dans le cas où il y a plusieurs commandes sur la même date.
Généralement, les fonctions de la fenêtre sont beaucoup plus rapides que n'importe quel look-ups à l'aide de MAX() sur un grand nombre d'enregistrements.
OriginalL'auteur user34850
OriginalL'auteur devio
Quelque chose comme:
OriginalL'auteur Benny Wong
Une approche que je n'ai pas vu plus haut encore:
Ce (ainsi que les autres solutions je crois), ce qui suppose que deux commandes pour le même client peut avoir exactement le même temps de la saisie. Si c'est une préoccupation, alors vous aurez à faire des choix quant à ce qui détermine lequel est le "plus tard". Si c'est un sujet de préoccupation poster un commentaire et je peux développer la requête si nécessaire, pour tenir compte de cela.
L'approche générale de la requête est de trouver la commande pour un client où il n'y a pas une autre commande pour le même client à une date ultérieure. C'est alors la dernière commande par définition. Cette approche permet souvent d'obtenir de meilleures performances, l'utilisation de tables dérivées ou des sous-requêtes.
Intéressant. Ne serait-ce pas obtenir de façon exponentielle plus pour chaque commande supplémentaire d'un client que la base de données devra joindre à chaque commande, pour toute autre commande?
OriginalL'auteur Tom H
Cette requête est beaucoup plus rapide que l'on a accepté la réponse :
OriginalL'auteur Saad Achemlal