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 :

Structure d'une requete


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 69
    Points : 40
    Points
    40
    Par défaut Structure d'une requete
    Bonjour,

    Voilà le format de données que je peux trouver dans ma table :

    Etat | Date de début

    Production | 18/06/2013 07:00
    Arrêt | 18/06/2013 08:00
    Panne | 18/06/2013 09:00
    Production | 18/06/2013 10:00

    La fin d'un état est défini par le début du suivant.

    Je cherche à avoir la somme des durées d'un état spécifique. Il faut donc pour avoir les durées de cet état spécifique avoir le début de l'état suivant.

    J'arrive à avoir ce que je veux avec des sous-requêtes (pour chaque état trouvé je fais une sous requête pour avoir l'état suivant), le résultat me sors ce que je veux mais les délais sont énormes sur une table avec beaucoup d'éléments.

    Y a t'il d'autres pistes d'amélioration au niveau de la requête pour avoir des temps convenable?

    Je précise que je ne peux pas dans l’immédiat changer la structure de la base. Il faut que je trouve la solution avec ce format.

    Merci d'avance pour votre aide.

    Cordialement,
    Nicolas.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Quel est le SGBD que vous utilisez ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 69
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    J'utilise pour mes essais Oracle, mais ce sera potentiellement déployable sur PostgreSQL également.

    Cordialement,
    Nicolas.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Pour connaître l'heure de changement d'état :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  deb.etat            AS Etat
        ,   deb.datedeb         AS Debut_Etat
        ,   MIN(sui.datedeb)    AS Fin_Etat
    FROM    matable deb
        LEFT JOIN
            matable sui
            ON  deb.datedeb < sui.datedeb
    GROUP BY deb.etat
        ,   deb.datedeb    
    ;
    Donc pour avoir les durées par état :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  eta.etat
        ,   SUM(eta.fin_etat - eta.debut_etat)  AS  duree
    FROM    (   SELECT  deb.etat            AS Etat
                    ,   deb.datedeb         AS Debut_Etat
                    ,   MIN(sui.datedeb)    AS Fin_Etat
                FROM    matable deb
                    INNER JOIN
                        matable sui
                        ON  deb.datedeb < sui.datedeb
                GROUP BY deb.etat
                    ,   deb.datedeb    
            )   eta
    GROUP BY eta.etat
    ;
    Avec un index sur (datedeb, etat), ça ne devrait pas prendre des heures...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Regarde LEAD

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 69
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Pour connaître l'heure de changement d'état :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  deb.etat            AS Etat
        ,   deb.datedeb         AS Debut_Etat
        ,   MIN(sui.datedeb)    AS Fin_Etat
    FROM    matable deb
        LEFT JOIN
            matable sui
            ON  deb.datedeb < sui.datedeb
    GROUP BY deb.etat
        ,   deb.datedeb    
    ;
    Donc pour avoir les durées par état :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  eta.etat
        ,   SUM(eta.fin_etat - eta.debut_etat)  AS  duree
    FROM    (   SELECT  deb.etat            AS Etat
                    ,   deb.datedeb         AS Debut_Etat
                    ,   MIN(sui.datedeb)    AS Fin_Etat
                FROM    matable deb
                    INNER JOIN
                        matable sui
                        ON  deb.datedeb < sui.datedeb
                GROUP BY deb.etat
                    ,   deb.datedeb    
            )   eta
    GROUP BY eta.etat
    ;
    Avec un index sur (datedeb, etat), ça ne devrait pas prendre des heures...
    Merci pour cette réponse rapide et intéressante.

    Juste une petite incompréhension de ma part, dans la première requête tu fais Min(Sui.DateDeb)
    Sui doit vouloir dire élément suivant mais concrètement comment celà se présentera au niveau SQL?

    Cordialement,
    Nicolas

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    sui est ici un alias de la table, qui est appelée plusieurs fois dans la requête.
    Je vous encourage à aller (re)lire les cours SQL pour mieux comprendre la structure de cette requête.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/09/2010, 22h52
  2. Réponses: 2
    Dernier message: 16/04/2010, 08h29
  3. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  4. Modifier la structure d'une requete
    Par energies dans le forum Access
    Réponses: 1
    Dernier message: 30/03/2006, 12h47
  5. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52

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