Home

--- Posted by Michel Walsh ---

Joindre des séquences contigues

En supposant qu'on possède des séquences From - To, un peu comme suit:

SequenceA		' nom de la table
Who, [From],[To]	' nom des champs
A, 1, 1
B, 17, 20
B, 21, 23
B, 26, 29
B, 30, 34
B, 35, 39
C, 1, 11
C, 12, 12
C, 13, 45
C, 46, 49
C, 50, 76

et, en fin d'ouvrage, on s'attend à obtenir le résultat:

A, 1, 1
B, 17, 23
B, 26, 39
C, 1, 1
C, 12, 76

On commence alors par une première requête, combinant tous les [From] avec les [To]+1

SELECT Who, [From] As Origine
FROM SequenceA

UNION ALL

SELECT Who, [To]+1
FROM SequenceA;

et que l'on sauvegarde comme QUseq.

Puis, une seconde requête avec laquelle on décompte le nombre d'apparition de chaque nombre:

SELECT QUseq.Who, QUseq.Origine
FROM QUseq
GROUP BY QUseq.Who, QUseq.Origine
HAVING (((Count(QUseq.Origine))<>2))
ORDER BY QUseq.Who, QUseq.Origine;

et que nous sauvegardons sous le nom de QUseq1. La ligique est basée sur ce qu'un décompte de 2 nous indique une soudure ( [To]+1 = [From] ); ce compte de deux est possible de par ce qu'on a utilisé UNION ALL, non UNION, dans la première requête.

La requête ne nous retourne que les nombres n'ayant pas un décompte de deux, la requête nous retourne donc toutes les nouvelles "limites", par exemple::

A, 1
A, 2
B, 17
B, 24
B, 26
B, 40
C, 1
C, 77

ce qui deviendra le résultat escompté:

A, 1, 1
B, 17, 23
B, 26, 39
C, 1, 76

à l'aide d'une traduction par une dernière requête:

SELECT QUseq1.Who, QUseq1.Origine, DMin("Origine","QUseq1","Who='" &
[Quseq1].[Who] & "' AND Origine >" & [Origine])-1 AS Expr1
FROM QUseq1 INNER JOIN SequenceA ON (QUseq1.Origine = SequenceA.From) AND
(QUseq1.Who = SequenceA.Who);

où l'utilisation de DMin()-1 défait notre travail initial sur [To]+1. Le join interne est requis pour retrancher les séquences "complémentaires", comme dans le cas de

B, 24, 25