Bonjour,

je me prends la tête depuis quelques heures sans arriver à mes fins :

Etant donnée une table, disons MaTable, avec comme champs :

-------------------------------------------------------------------------
Horodatage(datetime) | Variable1(float) | Variable2(float) | Variable3(float)
-------------------------------------------------------------------------
19/06/2008 14:47:43 | 0,4564 | 256,456 | ...
19/06/2008 14:47:44 | 0,3344752 | ...
19/06/2008 14:47:45 | 1,45752 | ..
19/06/2008 14:47:46 | 0,46 |
19/06/2008 14:47:47 | 0,37 |

Mettons qu'il y ait quelques milliers de ligne, un "horodatage" par seconde, j'essaie de trouver une requête me permettant de retourner par ex. les moyennes de Variable1, variable2 et Variable3 à la minute. J'essaie donc de faire une requête qui me renverrai ça :

-------------------------------------------------------------------------
Horodatage(datetime) | Variable1(float) | Variable2(float) | Variable3(float)
-------------------------------------------------------------------------
19/06/2008 14:47:00 | 0,4564 | 256,456 | ...
19/06/2008 14:48:00 | 0,3344752 | ...
19/06/2008 14:49:00 | 1,45752 | ..
19/06/2008 14:50:00 | 0,46 |
19/06/2008 14:51:00 | 0,37 |

Où, pour chaque ligne, on aurait la moyenne des valeurs pour la minute précédent l'horodatage (ex. ici la ligne 1 = moyenne des variables de 14H46 à 14H47)...
Avec une contrainte de plus : chaque datetime du résultat doit tomber "pile" (minute pile, ou heure pile pour des moyennes horaires, etc)...
Et, encore un truc, si la table peut contenir plusieurs mois de données, on peut ne vouloir restituer que tel ou tel jour, telle tranche horaire etc...

J'ai essayé plusieurs choses, j'arrive par ex. à retourner tous les horodatages à la minute dont j'ai besoin, mais pas avec les moyennes...

il me faudrait en fait ça :
select MAX(horodatage), avg(variable1), avg(variable2) from MaTable where horodatage between @dateMinimumAND @dateMaximum
mais pour tous les points à restituer, et en une seule requête...

J'ai essayé aussi ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
    SELECT distinct(DATEADD(minute, DATEDIFF(minute, 0, t1.horodatage), 1)), avg(t2.variable1) as MoyVar1, avg(t2.variable2) as MoyVar2, avg(t2.variable3) as MoyVar3
    FROM MaTable t1 
    INNER JOIN MaTable t2 on t2.horodatage BETWEEN (select DATEADD(minute, -1, DATEADD(minute, DATEDIFF(minute, 0, t1.horodatage), 1))) and DATEADD(minute, DATEDIFF(minute, 0, t1.horodatage), 1)
    group by t1.horodatage
ce qui est, vous en conviendrez, assez lamentable, et en plus ne retourne... rien !

Bref, à l'aide ...