Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Requêtes: Séquence continue, sans interruption

Author(s)
Michel Walsh

--- Soumis par Michel Walsh ---

Séquence continue, sans interruption

On possède une suite d'entiers, non nécessairement continus, pour laquelle on désire obtenir la longueur maximale d'une séquence sans interruption. Par exemple, avec 

data={1, 2, 5, 6, 7, 8, 9, 11, 13, 14, 18, 22, 23}

la séquence continue {5, 6, 7, 8, 9} est de longueur 5 et constitue ce maximum.

Un énoncé SQL relativement simple nous permet de trouver cette valeur en considérant qu'une valeur, soustraite de son "rang" dans la suite, est une constante pour une séquence ininterrompue donnée. Toujours plus simple avec une illustration:

data= {1,  2,  5,  6,  7,  8,  9,  11, 13, 14, 18, 22, 23}
rang= {1,  2,  3,  4,  5,  6,  7,    8,   9, 10, 11, 12, 13}
moins={0, 0,   2,  2,  2,  2,  2,   3,   4,  4,   7, 10, 10}

La dernière ligne est la soustraction des deux premières. Un décompte de ces différentes différences nous donne:

différence  	décompte
0,		2
2,		5
3,		1
4,		2
7,		1
10,		1

Si le nom de la table est Sequences et que le champ qui nous intéresse est Sample, la différence entre la valeur et son rang peut être obtenu avec une expression du genre:

Difference: [Sample]-DCount("*", "Sequences", "Sample<=" & [Sample] )

Ainsi, faire une nouvelle requête, amener la table Sequences. Appuyer sur le bouton de sommation, sur la barre d'outils, pour faire apparaître une nouvelle ligne, total. Amener le champ Sample dans la grille, changer le GroupBy par Count. Dans une nouvelle colonne de la grille, écrire l'expression proposée ci-dessus pour la différence, conserver le GroupBy. Examiner les résultats, vous devriez voir les colonnes de décompte et de différence. L'énoncé SQL devrait ressembler à:

SELECT Count(Sequences.Sample) AS CountOfSample,
[Sample]-DCount("*","Sequences","Sample<=" & [Sample]) AS Expr1
FROM Sequences
GROUP BY [Sample]-DCount("*","Sequences","Sample<=" & [Sample]);

Une fois sauvegardé, vous pouvez aisément extraire le maximum de la colonne correspondant au décompte, pour obtenir la valeur maximale cherchée, ici, 5. C'est tout!

Un exemple un peu plus costaud.

Une table JoueursParties avec les champs JoueurID et PartieNo. On désire, pour chaque joueur, obtenir sa séquence maximale de présence sans interruption. Les numéros des parties sont séquentiels, sans trous.

Pour ce faire, une première requête. On amène la table JoueursParties. On en fait une requête totale (bouton de sommation). On amène le champ JoueurID dans la grille, on conserve le GroupBy (on désire un résultat par joueur). On amène le champ PartieNo, on en change le GroupBy pour un Count. On ajoute une troisième colonne:

Occurrence: [PartieNo] - DCount("*", "JoueursParties", _
            "JoueurID=" & [JoueurID] & " AND PartieNo<=" & [PartieNo] )

et on sauvegarde, JPQ1.

Nouvelle requête, on amène JPQ1. On en fait une requête totale (bouton de sommation). On récupère le champ JoueurID, on conserve le GroupBy, on récupère le champ Occurrence, on y change le GroupBy pour un Max. Cette seconde requête affiche le résultat désiré. 

Et maintenant, pouvez-vous en faire autant, tout aussi aisément, avec simplement du code VBA?

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer