Filtrer des tuples à intervalle temporel régulier
Conditions préalables
Imaginons une table contenant plusieurs colonnes dont une est une estampille. Par exemple la table mesures :
CREATE TABLE mesures ( estampille TIMESTAMP WITH TIMEZONE PRIMARY KEY, valeur DOUBLE PRECISION);
Nous pouvons imaginer que les données sont temporellement réparties uniformément dans le temps (une donnée toutes les minutes par exemple).
Cas d'utilisation
On souhaite avoir les mesures entre deux dates en échantillonnant les données présentes dans la table mesures avec un intervalle régulier supérieur à la répartition initiale de la mesure (par exemple toutes les 5 minutes).
Requête
Nous allons utiliser la fonction EXTRACT avec comme argument EPOCH pour extraire le nombre de secondes écoulées depuis le 1er Janvier 1970 à minuit GMT sur l'estampille de chaque ligne. Nous pourrons ensuite utiliser la fonction modulo (%) pour fixer déterminer si la ligne est sélectionnable ou non.
SELECT * FROM mesures WHERE estampille BETWEEN CURRENT_TIMESTAMP - '1 day'::INTERVAL AND CURRENT_TIMESTAMP AND ( (EXTRACT(EPOCH FROM estampille)::INTEGER ) % (5 * 60) ) = 0;
Ainsi chaque fois que la date EPOCH sera un multiple de 5*60 secondes (5 minutes) le modulo sera égal à 0 et notre ligne sera sélectionnée.
–
Jean-Christophe Arnu le 15/09/2006