salut Philippe ,
Envoyé par
Philippe
On peut la voir ?
je sais pas, c'est intime comme question...
bon, je l'ai refait en détail pour expliquer sinon brut comme ca, ca fait un pavé et ca parait pas aussi simple que ca n'y parait.
j'ai supposé qu'il pouvait avoir des trous dans entre les enregistrements.
ce qui veut dire que je recherche :
la période comprenant le plus grand nombre de jours consécutifs SAISIE de baisse
ce qui complique un peu le sql sinon un j-1 ou j-2 sur la date simplifierait le sql (d'autant qu'il n'y a pas non plus d'indice ordonné par date des enregistrements)
Etape 1: trouver les premières variations descendantes
j'ai opté pour: si la variation du cours à la précédente date est négative et l'antécedant à celle-ci positive
d'abord le cours précédant <last> et antécédant à celui-ci <prevlast>:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
select
t1.*,
(
select
c1.coursfermeture
from cotation c1
where
(c1.datevaleur=
(
select max(c2.datevaleur) from cotation c2
where
(c2.datevaleur<t1.datevaleur)
and
(c2.codeaction=t1.codeaction)
)
)
and
(c1.codeaction=t1.codeaction)
) as last,
(
select
c1.coursfermeture
from cotation c1
where
(c1.datevaleur=
(
select max(c2.datevaleur) from cotation c2
where
(c2.datevaleur<
(
select max(c2.datevaleur) from cotation c2
where
(c2.datevaleur<t1.datevaleur)
and
(c2.codeaction=t1.codeaction)
)
)
and
(c2.codeaction=t1.codeaction)
)
)
and
(c1.codeaction=t1.codeaction)
) as prevlast
from cotation t1 |
les tendances des cours :
<tlast> = <coursfermeture> inférieur à <last> ?
<tprevlast> = <last> inférieur à <prevlast> ?
soit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
select
t1.*,
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
) as tlast,
(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
) as tprevlast
from cotation t1 |
LES PREMIERES TENDANCES A LA BAISSE:
<isPremDesc> = <tlast> and not <tprevlast>
adaptées au cas particuliers où dès le départ le cours baisse:
<isPremDesc> = <tlast> and not nz(<tprevlast>,0)
soit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
select
t1.*,
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
)
and not
(nz(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
,0)
) as isPremDesc
from cotation t1 |
Etape 2: définir la requete [baisse] de l'ensemble des enregistrements des premières baisses: (en vue de récupérer la date pour chaque enregistrement)
un truc du genre:
select * from cotation where <isPremDesc>
soit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
select
t1.*
from cotation t1
where
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
)
and not
(nz(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
,0)
) |
Etape 3: récapitulatif des baisses
requete [récapitulatif] de cotation avec: <du> la date de la baisse et <nbJCDesc> le nombre consécutif de jour de baisse
<du> = date la plus proche inférieur dans [baisse] et où <tlast> est une baisse
<nbJCDesc> = <datevaleur> - <du>
soit:
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 26 27 28 29 30 31 32 33 34 35 36
|
select
t2.*,
(
select
max(t1.datevaleur)
from cotation t1
where
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
)
and not
(nz(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
,0)
)
and
(t1.codeaction=t2.codeaction)
and
(t1.datevaleur<=t2.datevaleur)
and
(
t2.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t2.datevaleur) and (c2.codeaction=t2.codeaction))) and (c1.codeaction=t2.codeaction))
)
) as du,
(t2.datevaleur-du+1) as nbJCDesc
from cotation t2 |
Etape 4-Finale: Retrouver l’action et la période comprenant le plus grand nombre de jours consécutifs de baisse.
et bien avec la requete de récapitulatif des baisses cela parait simple, non?
un truc du genre:
select top 1 * from [recapitulatif] order by nbJCDesc desc
he bien non, ca marche pas... si l'enregistrement est bien choisi, les champs calculé <de> et <nbJCDesc> sont vide... merci ACCESS...
donc reste plus qu'à faire un sql du genre:
select * from [recapitulatif] where nbJCDesc=(select max(nbJCDesc) from [recapitulatif])
bon c'est vrai aussi que c'est plus correcte s'il y a plusieurs actions dont <nbJCDesc> est max.
réadaption [recapitulatif] pour avoir uniquement le max(nbJCDesc):
(nos amis sqlien des autres moteurs rigoleraient bien parce qu'il peuvent normalement faire des alias des requetes existants et les reprendres dans le même sql sans avoir à les réécrire...)
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 26 27 28 29 30 31 32 33
|
select
max(
(
select
t2.datevaleur-max(t1.datevaleur)+1
from cotation t1
where
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
)
and not
(nz(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
,0)
)
and
(t1.codeaction=t2.codeaction)
and
(t1.datevaleur<=t2.datevaleur)
and
(
t2.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t2.datevaleur) and (c2.codeaction=t2.codeaction))) and (c1.codeaction=t2.codeaction))
)
)
) as nbJCDesc
from cotation t2 |
soit la requete finale:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
select
tf.codeaction,
tf.du,
tf.datevaleur as au,
tf.nbJCDesc
from
(
select
t2.*,
(
select
max(t1.datevaleur)
from cotation t1
where
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
)
and not
(nz(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
,0)
)
and
(t1.codeaction=t2.codeaction)
and
(t1.datevaleur<=t2.datevaleur)
and
(
t2.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t2.datevaleur) and (c2.codeaction=t2.codeaction))) and (c1.codeaction=t2.codeaction))
)
) as du,
(t2.datevaleur-du+1) as nbJCDesc
from cotation t2
) tf
where
tf.nbJCDesc =
(
select
max(
(
select
t2.datevaleur-max(t1.datevaleur)+1
from cotation t1
where
(
t1.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
)
and not
(nz(
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t1.datevaleur) and (c2.codeaction=t1.codeaction))) and (c2.codeaction=t1.codeaction))) and (c1.codeaction=t1.codeaction))
,0)
)
and
(t1.codeaction=t2.codeaction)
and
(t1.datevaleur<=t2.datevaleur)
and
(
t2.coursfermeture
<
(select c1.coursfermeture from cotation c1 where (c1.datevaleur=(select max(c2.datevaleur) from cotation c2 where (c2.datevaleur<t2.datevaleur) and (c2.codeaction=t2.codeaction))) and (c1.codeaction=t2.codeaction))
)
)
)
from cotation t2
) |
voilà à quoi j'ai pensé rapidement comme solus,
Partager