lasnoufle La seule et unique! | Bon allez vite fait, en supposant que les reponses sont "oui", "oui" et que tu utilises une version d'Oracle recente. Ca va partir de la: SELECT t.ligne, SYS_CONNECT_BY_PATH(t.ligne,'/') AS path FROM table t CONNECT BY PRIOR t.ligne = t.ligne-1 AND PRIOR t.arrivee = t.depart; |
Cette requete va te trouver tous les trajets - mais en incluant tous les sous-trajets, donc il va falloir s'en debarasser et transformer tout ca pour compter tranquille. J'ai la flemme de verifier des trucs dans la doc donc ca va etre un peu "alaouanegaine" m'enfin ca va marcher. D'abord, tu calcules le nombre d'etapes de chaque trajet: SELECT ligne, path, LENGTH(path)-LENGTH(REPLACE(path,'/','')) AS length FROM ( SELECT t.ligne, SYS_CONNECT_BY_PATH(t.ligne,'/') AS path FROM table t CONNECT BY PRIOR t.ligne = t.ligne-1 AND PRIOR t.arrivee = t.depart); |
Ensuite tu filtres trajet avec le plus d'etapes par ligne: SELECT ligne, MAX(length) FROM ( SELECT ligne, path, LENGTH(path)-LENGTH(REPLACE(path,'/','')) AS length FROM ( SELECT t.ligne, SYS_CONNECT_BY_PATH(t.ligne,'/') AS path FROM table t CONNECT BY PRIOR t.ligne = t.ligne-1 AND PRIOR t.arrivee = t.depart)) GROUP BY ligne; |
Et la t'as quasi fini: pour ton comptage, toutes les lignes de longueur superieure a 1 comptent pour du beurre: SELECT ligne, DECODE(length,1,1,0) AS compte_trajet FROM ( SELECT ligne, MAX(length) FROM ( SELECT ligne, path, LENGTH(path)-LENGTH(REPLACE(path,'/','')) AS length FROM ( SELECT t.ligne, SYS_CONNECT_BY_PATH(t.ligne,'/') AS path FROM table t CONNECT BY PRIOR t.ligne = t.ligne-1 AND PRIOR t.arrivee = t.depart)) GROUP BY ligne); |
Et voila! T'as plus qu'a additioner compte_trajet. Message édité par lasnoufle le 02-01-2014 à 16:47:37 ---------------
C'était vraiment très intéressant.
|