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 :

Trouver le nombre max d'éléments apparu dans un intervale de temps


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 107
    Par défaut Trouver le nombre max d'éléments apparu dans un intervale de temps
    Bonjour, j'ai une requête assez compliquée pour moi à réaliser. Je tente depuis quelques heures mais j'ia quelque petits soucis, je vais donner un exemple pour être plus explique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    idErreur              typeErreur          heure
    --------------------------------------
       1                   type1             17:00
       2                   type1             18:00
       3                   type1             18:01
       4                   type1             18:02
       5                   type2             18:03
       6                   type2             19:30
       7                   type2             19:31
       8                   type1             20:00
       9                   type1             20:01
      10                   type3             20:02
      11                   type3             23:02
    En gros sur cette table je souhaite faire une requete, ou plutot une procédure stockée qui me permet d'avoir pour chaque type d'erreur, le nombre maximum d'apparition de cette erreur sur un intervale d'une heure.

    en gros j'obtiendrai à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typeErreur           nbApparitionMax
    ------------------------------------
      type1                      3  (pour les erreurs type1 de 18:00, 18:01 et 18:02)
      type2                      2  (pour les erreurs type2 de 19:30 et 19:31)
      type3                      1  (pour les erreurs type3 de 20:02 ou celle de 23:02)
    Je ne sais pas du tout comment faire
    Merci

  2. #2
    Rédactrice

    Avatar de Fleur-Anne.Blain
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 636
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT (TypeE)
    FROM table
    WHERE heure BETWEEN heure1 AND heure2
    GROUP BY (TypeE);
    la culture c'est comme la confiture moins on en a plus on l'étale.

    Mes tutos

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Il faut le faire en deux phases : calculer le nombre d'erreurs pour chaque heure puis retenir le plus grand.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT   c.typeErreur
          ,  MAX(c.nbErreur)   AS nbApparitionMax
    FROM  (  SELECT   e.typeErreur
                   ,  EXTRACT(HOUR FROM e.heure) AS heureErreur
                   ,  count(*) AS nbErreur
             FROM     matable  as e
             GROUP BY e.typeErreur
                   ,  e.heureErreur     
          )  AS c
    GROUP BY c.typeErreur
    ;
    Rien qu'en exprimant le besoin à haute voix, la requête se construit...
    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.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 107
    Par défaut
    Citation Envoyé par al1_24
    Il faut le faire en deux phases : calculer le nombre d'erreurs pour chaque heure puis retenir le plus grand.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT   c.typeErreur
          ,  MAX(c.nbErreur)   AS nbApparitionMax
    FROM  (  SELECT   e.typeErreur
                   ,  EXTRACT(HOUR FROM e.heure) AS heureErreur
                   ,  count(*) AS nbErreur
             FROM     matable  as e
             GROUP BY e.typeErreur
                   ,  e.heureErreur     
          )  AS c
    GROUP BY c.typeErreur
    ;
    Rien qu'en exprimant le besoin à haute voix, la requête se construit...

    Merci,

    Je ne vois pas trop le fonctionnement du "EXTRACT(HOUR FROM e.heure) AS heureErreur".

    J'ai l'impression que cette méthode EXTRACT sert à extraire l'heure. Par exemple si pour une erreur déclenché à 17h12, ca me retourne 17. ALors que dans mon cas je cherche le nombre d'erreurs entre 16h42 et 17h42...

    Je me suis mal expliqué et mon exemple est trompeur je crois.

    De plus ca ne fonctionne pas dans mon cas.
    Dans ma table, "heure" est un dateTime. Je ne sais pas si ça joue.

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    J'ai supposé que tu voulais parlé d'un heure glissante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT typeerreur,  MAX(nombre)
    FROM (SELECT a.iderreur,  a.typeerreur, COUNT(*) AS Nombre
          FROM dev_heure a INNER JOIN dev_heure b 
                                   ON a.typeerreur = b.typeerreur
                                  AND(b.dt -a.dt) * 24 BETWEEN 0 AND 1
          GROUP BY a.iderreur, a.typeerreur)
    GROUP BY typeerreur;
    Un détail : (b.dt -a.dt) * 24 calcule le nombre d'heures entre deux dates, si cette méthode ne fonctionne pas avec ton moteur, remplace cette partie là par la bonne fonction.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 107
    Par défaut
    Citation Envoyé par Médiat
    J'ai supposé que tu voulais parlé d'un heure glissante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT typeerreur,  MAX(nombre)
    FROM (SELECT a.iderreur,  a.typeerreur, COUNT(*) AS Nombre
          FROM dev_heure a INNER JOIN dev_heure b 
                                   ON a.typeerreur = b.typeerreur
                                  AND(b.dt -a.dt) * 24 BETWEEN 0 AND 1
          GROUP BY a.iderreur, a.typeerreur)
    GROUP BY typeerreur;
    Un détail : (b.dt -a.dt) * 24 calcule le nombre d'heures entre deux dates, si cette méthode ne fonctionne pas avec ton moteur, remplace cette partie là par la bonne fonction.

    Merci pour ta réponse... je regarderai demain au boulot

    Pour (b.dt -a.dt) * 24 BETWEEN 0 AND 1, je fais ABS(Datediff(hh,b.dt,a.dt))<1 ...

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

Discussions similaires

  1. [AC-2007] Connaitre le nombre d'individus dans un intervalle de temps.
    Par Anteu dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/01/2013, 11h04
  2. [XL-2007] Calculer le nombre d'heure dans un intervalle de temps
    Par sofianeb dans le forum Excel
    Réponses: 2
    Dernier message: 13/04/2010, 16h06
  3. Réponses: 10
    Dernier message: 21/03/2010, 22h41
  4. Réponses: 7
    Dernier message: 17/06/2008, 21h58
  5. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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