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?