Est-ce que "TOP 1" est un substitut fiable pour les fonctions d'agrégation telles que MIN() et MAX() ..? Ci-dessous est une requête de base dans Access 2007, pour déterminer la première fois qu'un client a commandé un certain produit pendant un certain mois. Le système de SGBD n'est probablement pas pertinent, car cette question pourrait s'appliquer à n'importe quel système.Dans une requête SQL, "TOP 1" est-il un substitut fiable pour les fonctions d'agrégation telles que MIN() ou MAX() ..?
Dans cette requête, "TOP 1" est utilisé en combinaison avec ORDER BY dans le champ de date. Cela renvoie un enregistrement, qui est le plus ancien par date. Mais ... est-ce correct? Qu'est-ce qui peut mal tourner ..? Y a-t-il un meilleur moyen ..?
SELECT TOP 1 DAACCT, DAITEM, DAQTY, DAIDAT
FROM fqlOrdersGrandHistory
WHERE DAACCT="T7414" AND DAITEM="45234" AND (DAIDAT>=20170501 AND DAIDAT<=20170531)
ORDER BY DAIDAT;
_ "Mais ... est-ce correct?" _ Oui, si vous n'avez pas plusieurs enregistrements avec la même date. Mais ce n'est pas la même chose que 'MIN' et' MAX' –
Cela ressemble à un problème XY. Je suppose que vous essayez d'utiliser une fonction d'agrégation mais que d'autres colonnes sont affichées, mais vous ne voulez pas les regrouper? Il existe des moyens de résoudre ce problème. Le fait de commander et d'utiliser select top 1 est une solution de contournement, comme l'a dit Tim, en supposant que vous commandez par valeurs uniques. –
Oui, c'est exactement ça. J'ai une requête qui renvoie un ensemble de factures, et je veux réduire cela à celui avec la date la plus ancienne. Donc, au minimum, j'ai besoin des champs pour le numéro de facture et la date. Si j'utilise MIN() dans ce scénario, cela ne fonctionne pas en raison des numéros de facture différents. Bien que je comprenne que c'est parce que chaque enregistrement et tous ses domaines sont évalués dans leur ensemble, je n'ai pas encore trouvé de solution à ce problème fondamental. – spinjector