Bonsoir,
Je vous explique succinctement mon problème :
Ma table T se présente ainsi :
c1 | c2 | c3 ...
-------------------------------
69654.4656 | A | c3(A) ...
69654.4776 | A | c3(A) ...
69654.4800 | A | c3(A) ...
...
69654.8403 | A | c3(A) ...
69654.9501 | A | c3(A) ...
69655.0006 | A | c3(A) ...
69655.1786 | A | 2*c3(A) ...
69655.2800 | A | 2*c3(A) ...
...
69656.8800 | A | n*c3(A) ...
69656.8994 | B | c3(B) ...
etc.
Quelques précisions :
- la colonne c1 est une clef primaire de type double et elle est croissante (il s'agit en fait de la valeur numérique d'une date, format Excel) ;
- la colonne c2 donne les groupes d'enregistrements au seins desquels je veux opérer ma requête ; tous les enregistrements de même valeur de c2 sont successifs ;
- la colonne c3 montre toujours le même type d'enchaînement : pour chaque instance de c2, c3 prend une valeur X puis au bout d'un certain nombre d'enregistrements, la valeurs 2*X, puis encore d'autres valeurs mais on ne s'y intéresse pas.
La requête que je veux faire :
Pour chacune des valeurs de c2, je veux toutes les lignes allant du premier enregistrement (pour cette valeur de c2) au troisième enregistrement (inclus) précédant le changement de valeur de c3.
Par exemple, pour la valeur A de la colonne c2, cela va de la ligne 1 à la ligne en gras.
Evidemment, le nombre d'enregistrements par valeur de c2 change.
J'obtiens donc une requête un peu compliquée et pas du tout optimisée, je vous la livre :
J'ai lancé cette requête sur une base relativement restreinte (environ 15 000 enregistrements), indexée mais je ne l'ai pas encore vue aboutir (ça fait quelques heures, déjà...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 select * from T t1 where t1.c1 between ( select min(t2.c1) from T t2 where t1.c2 = t2.c2 ) and ( select t3.c1 from T t3 where t3.c2 = t1.c2 and t3.c3 < ( select min(t4.c1) from T t4 where t4.c2 = t1.c2 and t4.c3 > 1.5 * ( select t5.c3 from T t5 where t5.c1 = ( select min(t6.c1) from T t6 where t6.c2 = t1.c2 ) ) ) order by t3.c1 desc limit 2,1 ) ;
Je suis donc en plein désarroi : ma requête est-elle juste ? Et quand bien même elle le serait, comment puis-je l'optimiser ? Mes connaissances en SQL sont vraiment trop limitées pour avoir la moindre idée de comment m'y prendre.
D'avance merci pour les conseils éclairés à venir !
Partager