Bonjour,
j'aurais besoin de faire une estimation d'une date moyenne, c'est à dire la date la plus "au milieu" d'un ensemble de dates. Ca me parait assez bizarre et je n'ai rien vu dans la doc qui parle de ça. Est-ce qu'il y a un moyen de le faire ?
Bonjour,
j'aurais besoin de faire une estimation d'une date moyenne, c'est à dire la date la plus "au milieu" d'un ensemble de dates. Ca me parait assez bizarre et je n'ai rien vu dans la doc qui parle de ça. Est-ce qu'il y a un moyen de le faire ?
Je pense que je ferai quelque chose de la façon suivante :
Je récupère la date la plus faible
Je la soustrais à toutes les autres dates (ce qui me donne la durée de toutes les périodes)
Je fais la moyenne de ces durées
Je l'ajoute à la date la plus faible.
La date "la plus au milieu", ce serait plutôt la médiane que la moyenne
http://fr.wikipedia.org/wiki/Médiane_(centre)
La méthode pour la calculer est
1. mettre les valeurs dans un tableau (pour ça voir la fonction array_accum dans la doc de postgresql)
2. trier: une fonction de tri générique de tableau est dispo ici:
http://www.postgres.cz/index.php/Pos...ral_array_sort
3. récupérer la valeur au milieu du tableau. Si le nombre de valeurs est impair, le milieu correspond directement à une valeur, sinon prendre l'indice juste en dessous. Certains font aussi la moyenne des deux valeurs autour du milieu.
Pardon j'ai fait un abus de langage avec "milieu", j'ai bien besoin de la moyenne et non pas la médiane. Du coup simplement obtenir la valeur centrale d'un tableau trié ne me suffit pas.
Je viens d'ailleurs de penser que ma moyenne ne devra pas tenir compte de l'année, il me faut seulement une certaine époque de l'année. Je viens aussi de voir que PostGre fournit une fonction "EXTRACT doy" qui permet de récupérer le nombre de jours d'une date depuis le début de l'année. Partant de là il serait facile de calculer une moyenne sur des simples entiers.
Par contre je ne vois pas d'équivalent pour ensuite reconstruire une date avec un nombre de jours...
De plus j'imagine que créer une date sans année spécifique peut être embêtant. Je sens que je vais récupérer le nombre de jours et traiter tout ça hors SQL pour reconvertir en jours/mois. D'ailleurs je me demande si PostGre prend en compte les années bissextiles.
Pour ceux qui voudraient une date moyenne tenant compte de l'année, un post parle d'une fonction "to_days" retournant le nombre de jours total depuis l'an zéro, mais je n'ai pas trouvé cette fonction dans la doc PostGre.
Bonjour,
J'ai pas PostgreSQL sous la main, mais quelque chose comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT (TIMESTAMP '2009-01-01 00:00' + AVG(EXTRACT(DOW FROM 'champDate')));
Tiens en effet j'avais pas vu qu'on pouvait faire ça, à ce moment là la construction de la date est plus simple en effet. La bonne syntaxe est la suivante :
Dans mon cas je n'avais pas besoin de timestamp mais seulement d'une date, mais ça peut facilement s'adapter. J'ai dû arrondir puis convertir le résultat de la moyenne car "date" ne peut s'additionner qu'avec un entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT date '2009-01-01' + cast(round(avg(extract(DOY FROM attribut)) - 1) AS integer) AS date_moyenne ...FROM... etc
J'obtiens un jour de plus à chaque fois qu'avec ma reconversion php. Je ne sais pas si c'est moi qui ai fait une erreur ou seulement si PostGre tient compte des années bissextiles (ce que je ne fais pas dans mon php).
Edit : non en fait je viens de me dire que j'ajoute le nombre de jours à une date partant du 1er de l'an, elle compte donc déjà le premier jour comme passé. Pour corriger ça j'enlève 1 à la moyenne.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager