2013-02-20 6 views
3

J'ai un problème de fenêtre coulissante. spécifiquement, je ne sais pas où ma fenêtre devrait commencer et où elle devrait se terminer. Je connais la taille de mon intervalle/fenêtre.sql fenêtre coulissante - trouver la valeur maximale sur l'intervalle

J'ai besoin de trouver le début/la fin de la fenêtre qui offre le meilleur scénario (ou le pire, selon la façon dont vous le regardez).

ici est un ensemble de données exemple:

value | tstamp 
100 | 2013-02-20 00:01:00 
200 | 2013-02-20 00:02:00 
300 | 2013-02-20 00:03:00 
400 | 2013-02-20 00:04:00 
500 | 2013-02-20 00:05:00 
600 | 2013-02-20 00:06:00 
500 | 2013-02-20 00:07:00 
400 | 2013-02-20 00:08:00 
300 | 2013-02-20 00:09:00 
200 | 2013-02-20 00:10:00 
100 | 2013-02-20 00:11:00 

Disons que je sais que mon intervalle doit être 5 minutes. donc, j'ai besoin de connaître la valeur et les horodatages inclus dans l'intervalle de 5 minutes où la somme de «valeur» est le plus élevé. dans mon exemple ci-dessus, les lignes de '2013-02-20 00:04:00' à '2013-02-20 00:08:00' me donneraient une somme de 400 + 500 + 600 + 500 + 400 = 2400 , qui est la valeur la plus élevée sur 5 minutes dans ce tableau.

Je ne suis pas contre l'utilisation de plusieurs tables si nécessaire. mais j'essaie de trouver un "meilleur scénario" intervalle. les résultats peuvent aller dans un sens ou dans l'autre, à condition qu'ils soient nets. Si je reçois tous les points de données sur cet intervalle, cela fonctionne toujours. si je reçois les points de départ et de fin, je peux aussi les utiliser.

J'ai trouvé plusieurs problèmes de fenêtres glissantes pour SQL, mais je n'ai trouvé aucun où la taille de la fenêtre est le facteur connu, et le point de départ est inconnu.

+0

Quels SGBDR utilisez-vous? –

+0

J'utilise postgres, et je n'ai pas beaucoup d'autres options pour le moment. – jasonmclose

+0

@jasonmclose: quelle version de PosgreSQL? – Quassnoi

Répondre

6
SELECT *, 
     (
     SELECT SUM(value) 
     FROM mytable mi 
     WHERE mi.tstamp BETWEEN m.tstamp - '2.5 minute'::INTERVAL AND m.tstamp + '2.5 minute'::INTERVAL 
     ) AS maxvalue 
FROM mytable m 
ORDER BY 
     maxvalue DESC 
LIMIT 1 
+0

J'ai essayé, et j'ai eu un résultat, mais je n'ai aucune idée de ce que je regarde. Où avez-vous créé votre intervalle basé sur les horodatages? J'ai un peu de mal à comprendre la requête. – jasonmclose

+0

@jasonmclose: désolé, j'ai mal reçu votre demande, je pensais que vous aviez besoin de 5 enregistrements, pas 5 minutes. S'il vous plaît voir la nouvelle requête. – Quassnoi

+0

c'est ça. Cela fait exactement ce que j'avais besoin de faire. je vous remercie beaucoup pour votre aide. – jasonmclose

Questions connexes