|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 415 ![]() |
Bonjour à tous,
Je viens de retrouver une archive d’un ancien problème que je voudrais vous soumettre comme contribution… Pour simplifier, je prends une table de cotation comprenant les cours d’un certain nombre d’actions relevés quotidiennement. ![]() Le problème : retrouver l’action et la période comprenant le plus grand nombre de jours consécutifs de baisse. D’après mon jeu d’essai, je devrais obtenir : ![]() Pendant cette période l’action ACT1 chute pendant 4 jours consécutivement (passant de 2370 à 2340). Alors peut-être existe-t-il de meilleures méthodes pour résoudre ce problème mais pour ma part j’ai dû composer faute de mieux. Je commence par une requête intermédiaire R_Variation : Code sql :
![]() La colonne calculée [variation] donne la variation du cours de l’action par rapport à la cotation précédente. La variation peut donc être positive, négative ou nulle. Je reprends la requête précédente pour rédiger la requête RNbJoursConsec : Code sql :
![]() La colonne calculée [JoursTendance] permet de rendre compte des jours consécutifs avec la même tendance. Sa valeur repart à 1 à chaque fois que la colonne [variation] voit son signe changer. [JoursTendance] exploite une fonction VBA nommée nbJoursConsecutifs dont je donne le code à recopier dans un module: Code :
Vous noterez en ligne 27, l’appel récursif : Code :
nbJoursConsecutifs = nbJoursConsecutifs(DatePrec, CodeAction) + 1 Le problème : retrouver l’action et la période comprenant le plus grand nombre de jours consécutifs de baisse. R_Joursdebaisse : Code sql :
Que l’on adaptera facilement pour obtenir la période comprenant le plus grand nombre de jours consécutifs de hausse d’une action. Je mets un fichier de démo en pièce-jointe. Vouala… |
||||||||
|
10
|
|
|
#2 |
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
salut f-leb,
j'ai trouvé le sujet amusant. j'ai donc recherché une solution full sql. je n'y ai pas trouvé de grosse difficulté en particulier à réaliser cela. quand à coder en vb autant faire un simple parcours dans la requête ordonnée par date, cela me parait plus simple et rapide. en tout cas ta méthodologie est bien expliquée. bonne continuation, |
|
|
00
|
|
|
#3 | |
|
Membre Expert
![]() ![]() Inscription : avril 2006 Messages : 1 318 ![]() |
salut Diem
Citation:
@+ Philippe |
|
|
00
|
|
|
#4 | |||||||||||||||
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
salut Philippe
,Citation:
![]() 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) 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>: Code SQL :
les tendances des cours : <tlast> = <coursfermeture> inférieur à <last> ? <tprevlast> = <last> inférieur à <prevlast> ? soit: Code SQL :
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: Code SQL :
un truc du genre: Code SQL :
SELECT * FROM cotation WHERE <isPremDesc> Code SQL :
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: Code SQL :
et bien avec la requete de récapitulatif des baisses cela parait simple, non? un truc du genre: Code SQL :
SELECT top 1 * FROM [recapitulatif] ORDER BY nbJCDesc DESC donc reste plus qu'à faire un sql du genre: Code SQL :
SELECT * FROM [recapitulatif] WHERE nbJCDesc=(SELECT max(nbJCDesc) FROM [recapitulatif]) 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...) Code SQL :
soit la requete finale: Code SQL :
voilà à quoi j'ai pensé rapidement comme solus, |
|||||||||||||||
|
|
20
|
|
|
#5 | ||||||
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 415 ![]() |
rahhh l’est fort le Vodiem, encore une rasta-requête de compet
Un petit souci cependant car le fait qu’il peut y avoir des jours sans cotation change un peu la donne… Je précise le cahier des charges avec un jeu de données modifié : Code :
Code :
Or, j’aimerais qu’elle retourne : Code :
Le problème devient : retrouver l’action et la période comprenant le plus grand nombre de séances consécutives de baisse. Je regarde à comment adapter ma méthode. Je ne doute pas que tu réussisses à adapter ton SQL en conséquence… A plus tard… |
||||||
|
10
|
|
|
#6 | ||
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
Citation:
![]() Citation:
sinon le résultat d'après le dernier exemple ne serait pas du 11/07/2010 au 15/07/2010, vu que les séances ne sont pas consécutives. ;P je me permets de reformuler ton idée: retrouver l'action et la période qui a la plus grande période de baisse avec le plus grand nombre de séance. mais même avec ca: qu'es ce qui est plus représentatif? une grande période avec une faible densité ou une petite période à grande densité? je dirais même : à quel moment l'un prévaut sur l'autre? par exemple: légende: B: jour de baisse -: pas de saisie N/X: N jours de baisse / X valeur saisie sur la période 7/4: B--BB-B 5/5: BBBBB 6/5: BBBB-B 15/4: B---B---B-----B 15/5: BB----------BBB lequel est le plus représentatif de la baisse? quel est la formulation la plus pertinente dans tous les cas de figure? |
||
|
|
10
|
|
|
#7 | ||||
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 415 ![]() |
Bonjour Vodiem,
Code :
J’aimerais que la requête ne retourne que les lignes 2,3 et 5 parce qu’elles comportent 5 séances de baisse à suivre alors que les lignes 1 et 4 n’en comportent que quatre (la durée en nombre de jours de la baisse m’importe peu en fait parce que les "trous" sont rares). Par contre j’ai besoin de savoir quand a débuté la baisse et quand elle se termine. Pour tenir compte des quelques jours sans séance de cotation, il faut juste modifier ma dernière requête R_Joursdebaisse comme suit : R_Joursdebaisse : Code sql :
Merci de ton intérêt pour cet exercice amusant |
||||
|
00
|
|
|
#8 | ||
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
bon, comme tu voudras...
20/4: B---B-----B--------B 5/3: B-B-B tu es conscient que 20/4 sera le résultat ? je décline toute responsabilité quand à l'exploitation de la requête... c'est à tes risques et péril, tu me signe une décharge... t'es conscient au moins que tu joues avec la bourse??? ![]() d'un autre côté ca me facilite le travaille, j'en étais à conjecturer des formules savante pour valoriser la distribution des points dans l'espace... encore un mystère qui ne sera pas élucidé ce soir... Code SQL :
|
||
|
|
10
|
|
|
#9 |
|
Membre Expert
![]() ![]() Inscription : avril 2006 Messages : 1 318 ![]() |
Chapeau bas pour vos réalisations
![]() Dièm, la requête la plus dingue que je n'ai jamais vu sous Access... J't'adore !!! (en bonne amitié seulement ...)Philippe |
|
10
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 415 ![]() |
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 415 ![]() |
Bon, revenez je n’ai pas fini !
Voici un nouveau jeu de données et le nouveau résultat souhaité : ![]() Vous voyez l’idée, sur la période du 2 au 16/08/2010, l’action ACT3 a chutée de 100 pts sur 4 séances consécutives de baisse. Le 06/07/2010, l’action ACT2 a chutée de 80 pts en une seule séance. Du 2 au 6/07/2010, l’action ACT1 a chutée de 70 pts sur 4 séances consécutives de baisse. Etc… Je donnerais ma solution (hybride SQL+VBA) une fois que Vodiem aura pondu sa soluce full SQL en moins de 80 lignes |
|
00
|
|
|
#12 | |||||
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
Citation:
on se "SQrL" depuis un bout de temps ensemble ;P Citation:
Citation:
Code SQL :
l'adsl, bien sur... bonne appétit! ^^ |
|||||
|
|
10
|
|
|
#13 | |||||||||
|
Expert Confirmé Sénior
![]() ![]() Fabien Enseignant Inscription : janvier 2009 Messages : 2 415 ![]() |
Citation:
![]() Encore une belle requête qui donne bien le résultat souhaité en tout cas. Je donne ma solution, histoire de contribuer un peu quand même …Je reprends ma requête intermédiaire R_Variation du premier message : Code sql :
Dans la même idée, j’utilise ensuite la requête RSeancesConsec, avec une fonction récursive SeancesConsecutives. RSeancesConsecutives : Code sql :
Code :
![]() Et la requête finale R_f-leb Code sql :
Résultat en pièce-jointe où j’ai également inclue la fameuse requête R_Vodiem .Je pense que j’en ai maintenant terminé avec cette modeste contribution, à bientôt. |
|||||||||
|
00
|
|
|
#14 |
![]() ![]() Denis Développeur informatique Inscription : août 2004 Messages : 3 206 ![]() |
Bravo à vodiem et Fabien pour cette contribution
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp. Bon développement ! Mes tutoriels et contributions sur ma page perso: Ma page personnelle |
|
00
|
Copyright © 2000-2012 - www.developpez.com