--- Soumis par Michel Walsh ---
Sequence 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}D'où, 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, 1Si le nom de la table est Sequences et que le champ qui nous intéresse est Sample, le 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, changer le GroupBy par Count. Dans une nouvelle colonne de la grille, écrire l'expression proposée ci-dessus pour la difference, 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.
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, 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:
Occurence: [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 Occurence, 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?