Bonjour, bonjour,
J'ai de sérieuses difficultés avec une requete sql, j'utilise mysql5.0 sur 1and1.
L'idée générale de ma requete est de selectionner une date et une valeur de production par jour, sur une période donnée, ici on cherche les valeurs sur 1 an.
(Je selectionne un couple de valeur (date/production) par jour, il est nécessaire que ce soient la valeurs de fin de journée)
La table ressemble grossierement à qqch comme ça :
La requete :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 date | prod | ____________________________________ ... ... 2012-05-14 08:00:00 | 152000 | 2012-05-14 08:10:00 | 152200 | 2012-05-14 08:20:00 | 152300 | ... ... 2012-05-14 20:10:00 | 171900 | 2012-05-14 20:20:00 | 172000 | 2012-05-15 08:00:00 | 172100 | ... ...
SELECT date, MAX(production), FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date) <= 365 GROUP BY DAYOFYEAR(date) ORDER BY date ASC (1)
J'obtiens bien une valeur de production et une date par jour, soit 365 couples de résultats
Mon problème est que lorsque j'utilise MAX sur production, la requete selectionne bien le max de la variable mais il est impossible d'avoir la date correspondante (le couple [date / prod] présent en BD), ex :
Résultats d'une journée:
-> Or la véritable date qui correspond à cette production est 2012-05-14 20:20:00
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 date | MAX(prod)| ___________________________ 2012-05-14 08:00:00 | 172000|
(La solution que j'ai trouvé sur des petites périodes, pour être sûr de prendre le dernier couple date/production de la journée, est de faire : 'select prod, date from table where date like '%datecherchée%' order by date DESC limit 1' OU 'select MAX(prod), MAX(date) from table where date like '%datecherchée%''
ici on selectionne toutes les données de la journée pour les trier de la plus récente à la plus ancienne, j'ai donc bien le dernier couple de la journée cherchée. Mais faire boucler 365 fois cette requete bwarf!)
(dans ma premiere requete) En utilisant le '...GROUP BY DAYOFYEAR(date)...' pour que la requete s'execute sur 365 jours, le ORDER BY ne trie que l'ensemble des résultats, et n'a aucun effet sur les valeurs sélectionnées en base.
En utilisant MAX sur date et sur production j'aurai la majorité du temps les bons résultats , mais je ne veux pas utiliser MAX car si par exemple la derniere donnée de production bug (est à 0 ou à une valeur inférieur à la précédente), MAX ne me le sélectionnera jamais et donc je ne le saurais pas -> j'aurai un couple avec : une valeur de production du matin, et une date du soir -> très mauvais!!!
Comment je peux faire fonctionner cette requête pour que : la date et la production sélectionnées soient à chaque fois le dernier couple de valeur de la journée :
SELECT date, production, FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date) <= 365 AND GROUP BY DAYOFYEAR(date) ORDER BY date ASC
J'ai essayé quelques requêtes imbriquées, que je n'ai pas vraiment réussi à faire fonctionner ou alors avec un temps d'exécution beaucoup trop long.
J'ai pas l'impression que ce que je cherche à faire soit très compliqué, mais je patauge, je dois mal m'y prendre. Avis à la populas si quelqu'un peu m'aider!
Merci d'avance
Partager