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: Joindre des séquences contiguës

Author(s)

--- Posted by Michel Walsh ---

Joindre des séquences contiguës

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, 76

On peut alors commencer par une première requête, combinant tous les [From] avec les valeurs [To] augmentées de +1

SELECT Who, [From] As Origine
FROM SequenceA

UNION ALL

SELECT Who, [To]+1
FROM SequenceA;

et que l'on sauvegarde comme QUseq.

Puis, on effectue 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 logique est basée sur ce qu'un décompte de 2 nous indique une soudure (un [To]+1 est égal à un [From] d'un autre enregistrement); ce compte de deux est possible de par ce qu'on a utilisé UNION ALL, non UNION, dans la première requête. En effet, un UNION simple enlève les duplicats, et un compte de deux ne se serait jamais produit si on n'avait pas utilisé le descripteur ALL.

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", les nombres qui ne se sont pas "soudés", 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. La jointure interne est requis pour retrancher les séquences "complémentaires", comme dans le cas de

B, 24, 25

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