mardi 24 mars 2009

Select dans un historique

Pour éviter de tout le temps réinventer la roue, voici la requête pour extraire des événements consécutifs dans un historique.
On désire les evt A qui précèdent les evt B (sans forcément être juxtaposés) dans la table historique genre...
+---+---+--------+
|cle|evt| chrono |
+---+---+--------+
| X | A |     81 | <- lui
| X | C |    212 |
| X | B |    215 | <- lui
| X | A |    426 |
| X | A |    575 | <- lui
| X | B |   1257 | <- lui
| X | B |   2301 |
+---+---+--------+


select a.cle, max(a.chrono) "evtA", b.chrono "evtB"
from historique a
, (select bb.cle, aa.chrono ref, min(bb.chrono) chrono
from historique bb, historique aa
where aa.cle = bb.cle
and aa.chrono < bb.chrono
and aa.evt = 'evtA' -- mettre ici code evt pour evtA
and bb.evt = 'evtB' -- mettre ici code evt pour evtB
group by bb.cle, aa.chrono) b
where a.cle = b.cle
and a.chrono < b.chrono
and a.evt = 'evtA'
group by a.cle, b.chrono

La sous-requête renvoie les plus proches événements A postérieurs aux événements B.
Le requête retrouve les plus proches événements B antérieurs à ceux de la sous-requête.