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

Langage SQL Discussion :

Evolution du nombre de clients des 60 derniers jours


Sujet :

Langage SQL

  1. #21
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par Sango64 Voir le message
    Avez vous une explication de cette différence d'exécution entre la requête précédente et celle ci alors que la votre semble visuellement un peu plus complexe ?
    Dans votre requête, vous croisez directement votre calendrier avec votre table de clients, vous faites donc une jointure puis un agrégat sur la somme cumulée de votre nb_lignes_clients par jour, sur 60 jours glissants, ce qui monte assez vite en terme de volume : en supposant 5 clients par jour pour simplifier le calcul (et j'espère que vous avez plus de clients que ça), ça vous donne un volume de 5 + 10 + 15 + 20... + 300 soit 9150 lignes.

    Dans la requête que je vous ai proposée, on fait d'abord un agrégat du nombre de clients par jour, ce qui donne un résultat beaucoup plus petit mais surtout avec au maximum une ligne par jour.
    Une fois la jointure faite sur le calendrier, le résultat en nombre de ligne sera au maximum 1 + 2 + 3 + 4 ... + 60 soit 1830 lignes, ce qui est finalement un petit résultat pour une jointure avec une inégalité, et le second agrégat est bien plus rapide à calculer.

    Enfin sur votre code, perdez la mauvaise habitude permise sous MySQL d'avoir un SELECT différent de votre GROUP BY.
    De plus, découvrez la fonction COALESCE et recoder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        select dat.dates                        as date_creation_client
             , sum(coalesce(cli.nb_clients, 0)) as nb_clients
          from dates as dat
     left join ( select coalesce(date_format(date_creation_client, '%Y%m%d'), '1970-01-01') as date_creation_client
                      , count(*)                                                            as nb_clients
                   from client
               group by coalesce(date_format(date_creation_client, '%Y%m%d'), '1970-01-01')) as cli
            on dat.dates >= cli.date_creation_client
         where dat.dates >= '2016-07-22'
      group by dat.dates
      order by dat.dates asc;
    Gardez aussi le coalesce dans la sum de second agrégat, il est utile pour "boucher les trous", surtout si vous en avez en début de période.

  2. #22
    Membre régulier
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Points : 71
    Points
    71
    Par défaut
    Bonsoir,

    Merci beaucoup pour votre réponse très claire. Je réponds tardivement car je ne l'avais pas vu (deuxième page) >_<.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Sélection des 7 derniers jours sur une table de faits
    Par Fatah93 dans le forum SAS Base
    Réponses: 4
    Dernier message: 27/04/2009, 13h48
  2. Conserver uniquement les backups des 7 derniers jours
    Par MinsK dans le forum Scripts/Batch
    Réponses: 21
    Dernier message: 25/02/2009, 17h18
  3. Réponses: 5
    Dernier message: 02/06/2008, 09h46
  4. [Dates] liste des 365 derniers jours
    Par CinErarY dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/08/2007, 17h54
  5. Rechercher les documents des 7 derniers jours...
    Par titoumimi dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 09/03/2006, 16h29

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