IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

array_to_string avec dates manquantes


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 23
    Points
    23
    Par défaut array_to_string avec dates manquantes
    Bonjour,

    Voici ce que je souhaite faire :

    Table 1 : "visite"
    idsite (int)
    date (date)
    Table 2 : "site"
    idsite (int)
    historiquevisites (text)
    Je souhaite mettre à jour la valeur "historiquevisites" de la table "site" à partir des données de la table "visite" en agrégeant les 90 derniers jours sous la forme suivante : valeur,valeur,valeur,valeur...

    ce qui donne par exemple :
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,1,1,1,1,1
    J'utilise pour cela le code suivant imbriqué dans une requête SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    traficsearch90history = (SELECT array_to_string(array(SELECT COUNT(*) 
    FROM visite WHERE idsite = s.idsite) GROUP BY date order by date asc), ','))
    mais, parce qu'il y a forcément un mais...

    la table visite ne contient des valeurs que si le nombre de visite à une date donnée est > 0.

    - Il y a donc des cas ou il y a moins de 90 jours de données, il aurait fallut compléter avec des 0
    - Il y a donc des cas ou il y a des trous de données, par exemple 2 visites le lundi, 0 le mardi et 6 le mercredi

    Logiquement il faudrait à la place d'ordonner par date, prendre la liste des dates des 90 derniers jours de façon croissante, puis contrôler la valeur du COUNT(*) pour la date et si elle est > 0 l'utiliser, sinon mettre 0.

    Mais je n'ai pas la moindre idée de comment faire cela.

    J'utilise Postgresql 9.1

    Si vous avez des suggestions, je suis preneur !

    Merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    il faut passer par une jointure externe entre une table (ou cte) générée sur les 90 jours et votre table visite actuelle.

    un exemple de cte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    with tmp as (
    select current_date - 90 + generate_series(1, 90) as dte)
     
    select * 
    from tmp

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bonjour,


    il faut passer par une jointure externe entre une table (ou cte) générée sur les 90 jours et votre table visite actuelle.

    un exemple de cte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    with tmp as (
    select current_date - 90 + generate_series(1, 90) as dte)
     
    select * 
    from tmp

    Merci beaucoup pour ton aide, ca fonctionne

    Voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT array_to_string(array(WITH dates AS (SELECT current_date - 90 + generate_series(1, 90) AS dte) SELECT (SELECT COUNT(*) FROM visite WHERE date = dte AND idsite = 6441) FROM dates ORDER BY dte ASC), ',');
    qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0
    A noter que pour un SUM à la place du COUNT, il faut utiliser COALESCE avec 0 en valeur par défaut, sinon ca ne fonctionne pas correctement.

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 15h07
  2. [C#] Requête MS Access (Problème avec Date)
    Par Erakis dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/02/2005, 22h54
  3. [VB.NET] Pb avec date sur VB.Net
    Par mpascolo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/01/2005, 09h14
  4. Réponses: 4
    Dernier message: 24/08/2004, 13h54
  5. Prob avec dates delphi
    Par ericmart dans le forum ASP
    Réponses: 6
    Dernier message: 20/10/2003, 17h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo