Requete mysql un peu complexe !!

Signaler
Messages postés
7
Date d'inscription
samedi 28 août 2010
Statut
Membre
Dernière intervention
28 août 2010
-
dominique.stock
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
-
Bonjour, y a t il quelqu'un qui peux m'aider !!???
J'ai une table MySql qui contient des valeur prise à chaque jour (colonne date, et colonne valeur).
Je veux une requete qui me permet de :
faire la moyenne des  troix max d'une valeur pour chaque semaine.
c'est un peu urgent !!
Merci d'avance !

13 réponses

Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
Salut,

Il te faut faire une requête imbriquées je pense :

Select ... FROM (SELECT Max(Value) FROM TaTable WHERE TaDate Between ... )
______________________________________
DarK Sidious
Messages postés
7
Date d'inscription
samedi 28 août 2010
Statut
Membre
Dernière intervention
28 août 2010

C'est sûrqu'il y aura des requetes imbriquées, mais la question c'est quelles sont les requetes et comment les imbriqués pour avoir un tel résultat !!!
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
Salut,

Ben comme je te l'ai dit : SELECT ... FROM (SELECT ... FROM)

Il te faut une première requête qui va te sélectionne les trois premières lignes de la table en question, triée par ordre décroissant avec une date comprise entre le premier jour de la semaine et le dernier, et à partir de cette requête, calculer la moyenne des valeurs voulues.
______________________________________
DarK Sidious
Messages postés
7
Date d'inscription
samedi 28 août 2010
Statut
Membre
Dernière intervention
28 août 2010

Ce que t'as proposé me donne la moyenne des trois max d'une seule semaine, alors que je veux avoir la moyenne des trois max de chaque semaine !!
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
Salut,

Pour récupèrer pour chaque semaine je crois que tu n'a guère le choix : tu devra faire une boucle sur chaque semaine que tu veux afin d'exécuter la requête, à moins que tu sache faire une requêtes qui te renvoie les dates de chaque semaine...
______________________________________
DarK Sidious
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
Bonjour,
Voici une requête qui donne ce que tu souhaites mais sous MS SQL ...
A adapter (surtout le "top 3" je ne sais pas si cela existe sous mysql :

 select avg(id),semaine from (
 select id,datepart(dw,h.TEMPS) as semaine from
 histo_varchar h where id in ( select top 3 id from histo_varchar where datepart(dw,TEMPS)=datepart(dw,h.TEMPS) order by id desc)
 ) t group by semaine

Histo_varchar : ta table
id : tes valeurs
temps: ta date

Dom
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
oups à la place des "dw" mettre "wk" ...

Dom
Messages postés
7
Date d'inscription
samedi 28 août 2010
Statut
Membre
Dernière intervention
28 août 2010

Merci, est-ce que tu peux m'expliqué chaque partie de ta requete pour que je puisse la traduire en MySql;

pour la fct datepart(wk, date) : en MySql il ya la fonction YearWeek qui donne le numéro de la semaine à partir d'une date donnée en argument ;
pour la fontion TOP, il ya la fonction LIMIT en MySql , normalemnt c'est la meme chose;

et c'est quoi la variable "h " ??
et je crois que cette requete ne permet d'avoir que les resultats d'une seule semaine !! non ?
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
select avg(id),semaine from (
 select id,datepart(dw,h.TEMPS) as semaine from
 histo_varchar h where id in ( select top 3 id from histo_varchar where datepart(dw,TEMPS)=datepart(dw,h.TEMPS) order by id desc)
 ) t group by semaine

En faites h permet juste  de renommer la table histo_varchar afin que SQL (et l'utilisateur )  ne se mélange pas les pinceaux entre les requêtes imbriquées  ...

La bleue permet de sélectionner les 3 valeurs plus élevées d'une semaine
La rouge permet de les récupérer pour toutes les semaines de ta table
La verte fait la moyenne par semaine

Dom
Messages postés
7
Date d'inscription
samedi 28 août 2010
Statut
Membre
Dernière intervention
28 août 2010

j'ai traduit vos requete (celles en rouge et en bleue) en MySql :

select traffic,yearweek(date,1) as semaine from  maTable T where (date,ci,traffic) in
(select date,ci, traffic from maTable where yearweek(date,1)=semaine order by traffic desc  )

et voila le résultat :

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

C'est à cause de la fct 'Limit', la version de mysql ne peut pas l'utilisé dans une sous requete !!

A part àa, votre requete à l'air de résoudre mon pb ! Merci beaucoup;
Reste maintenant à trouver un autre équivalent à 'limit' ;
Messages postés
7
Date d'inscription
samedi 28 août 2010
Statut
Membre
Dernière intervention
28 août 2010

Désolé, j'ai mal copier la requete il manque la fontion clef "limit" :

select traffic,yearweek(date,1) as semaine from  maTable T where (date,ci,traffic) in
(select date, traffic from maTable where yearweek(date,1)=semaine order by traffic desc limit 3  )
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
N'est-ce pas plutôt comme cela la syntaxe ?
"order by traffic desc limit 0,3"




Dom
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
Excuses , je n'avais pas lu
" la version de mysql ne peut pas l'utilisé dans une sous requete !! "

Dom