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 :

Requête max group by problème


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut Requête max group by problème
    Bonjour à tous,

    Voici la définition de ma table SensorsValues : :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sv_Year, sv_Month, sv_Day, sv_Time, sv_SensorID, sv_Value
    J'aimerais obtenir l'heure(sv_Time) et la valeur(sv_Value) de la plus petite valeur pour quand le sensor = 2 et que la pédiode est comprise entre 00:00:00 et 04:00:00.

    Voici ce que j'ai jusqu'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT sv_Time, MIN(sv_Value)
    FROM SensorsValues AS SubQuery
    WHERE sv_SensorID = 2 AND sv_Year = 2008 AND
           sv_Month = 1 AND sv_Day = 27 AND
           sv_Time >= '00:00:00' AND sv_Time < '04:00:00'
    Mais cela ne fonctionne pas
    Quelqu'un pourrais me donner un coup de main ?

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select *
    from   Sensor as x
    where  (select Count(*)
            from   Sensor as y
            where  x.SensorId = y.SensorId
            and    x.sv_Year = y.sv_Year
            and    x.sv_Month  = y.sv_Month
            and    x.sv_Day  = y.sv_Day
            and    x.sv_Time between '00:00:00' and '03:59:59'
            and    x.valeur > y.valeur) < 1
    Rajouter au besoin le filtre sur la date : 27 janvier 2008.

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Je ne suis pas sur de comprendre ton cheminement
    À quoi sert le COUNT ici ?

    J'ai besion de la plus petite valeur de sv_Value pour la date du 27 janvier 2008, lorsque le temps est compris entre 00:00:00 et 04:00:00 et que le sensor est égale à 2.

    Est-ce que tu m'as proposé ?

  4. #4
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Je procède par auto-jointure, afin de comparer les valeurs les unes aux autres (pour un même sensor, à la même date).
    Je compte combien de fois (d'où le Count) une valeur est > aux autres.
    Si elle ne l'est jamais (d'où le "< 1") c'est qu'elle est la plus petite et donc la bonne.

    Je reprends la requête, car le Between n'était pas à sa place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select *
    from   Sensor as x
    where  (select Count(*)
            from   Sensor as y
            where  x.SensorId = y.SensorId
            and    x.sv_Year = y.sv_Year
            and    x.sv_Month  = y.sv_Month
            and    x.sv_Day  = y.sv_Day
            and    x.valeur > y.valeur) < 1
       and    SensorId = 2
       and    sv_Time between '00:00:00' and '03:59:59'
       and    sv_Year = 2008 and sv_Month = 1 and sv_Day = 27
    Je vérifierai si je n'ai pas laissé passer une anomalie.

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Merci, je vais essayer. Selon tes explications ça semble bien. Honnêtement j'aurais jamais pensé à une solution de ce genre, c'est ingénieux !

    Au fait, je me demande si cela aurait fonctionné d'extraire les données du sensor #2 pour la date du 27 janvier 2008 et de les classé en ordre croissant. Ensuite récupérer la clé du PREMIER item de cette liste et s'en servir dans un WHERE pour la retrouver dans la table SensorsValues ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Si tu as 2 moments (donc 2 lignes) qui ont la valeur mini, tu ne le verras pas apparaître.

  7. #7
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Je n'ai aucun mérite, car j'ai récupéré l'idée chez Chris Date, comme je l'ai expliqué à une époque à CED :

    http://www.developpez.net/forums/sho...61&postcount=8

    (Discussion : http://www.developpez.net/forums/sho...d.php?t=370035)

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

Discussions similaires

  1. Formulation d'une requête mysql avec max & group by
    Par Didier100 dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/09/2010, 16h37
  2. Problème sous-requête MAX et COUNT
    Par grafistolage dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/07/2010, 09h08
  3. Requête avec max(), group by et having. je m'y perds
    Par hispanus dans le forum SQLite
    Réponses: 3
    Dernier message: 11/02/2010, 15h29
  4. [Requête]Problème avec requête max
    Par vcattin dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/03/2007, 15h49
  5. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 16h10

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