Je suis en train de concevoir un panier. Pour contourner le problème des anciennes factures affichant des prix inexacts après la modification du prix d'un produit, j'ai déplacé le champ de prix de la table Product dans une table ProductPrice composée de 3 champs, pid, date et price. pid et date forment la clé primaire de la table. Voici un exemple de ce que la table ressemble à:SQL "GROUP BY" question
pid date price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54
En utilisant SELECT
et GROUP BY
pour trouver le dernier prix de chaque produit, je suis venu avec:
SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid
La date et pid retour étaient exacts. J'ai reçu exactement 1 entrée pour chaque pid unique et la date qui l'accompagnait était la dernière date pour ce pid. Cependant, ce qui est venu comme une surprise était le prix retourné. Il est revenu le prix de la première ligne correspondant à la pid, qui dans ce cas était 50.
Après retravaillant ma déclaration, je suis venu avec ceci:
SELECT pp.pid, pp.price, pp.date FROM ProductPrice AS pp
INNER JOIN (
SELECT pid AS lastPid, max(date) AS lastDate FROM ProductPrice GROUP BY pid
) AS m
ON pp.pid = lastPid AND pp.date = lastDate
Alors que la déclaration retravaillé donne le prix correct (54), il semble incroyable qu'une telle requête de sondage nécessite une jointure interne à exécuter. Ma question est la suivante: Ma deuxième déclaration est-elle le moyen le plus facile d'accomplir ce que j'ai à faire? Ou est-ce que je manque quelque chose ici? Merci d'avance!
James
plus simple, mais seulement sur Postgresql: SELECT DISTINCT ON (pid) pid, date, prix DE ProductPrice ORDER BY pid, date DESC –