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 :

afficher le premier element par date dans un group by


Sujet :

Langage SQL

  1. #1
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut afficher le premier element par date dans un group by
    Bonjour

    J'ai cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT SQL_NO_CACHE avl_event.ID, avl_event.VEHICLE_ID, avl_event.DRIVER_ID, avl_event.EVENT_TYPE_ID, avl_event.CREATED_AT,
    avl_event.MESSAGE, avl_event.RECEIVED, avl_event.LONGITUDE, avl_event.QUADRANT_LONG, avl_event.LATITUDE,
    avl_event.QUADRANT_LAT, avl_event.HEADING, avl_event.SPEED, avl_event.LOCATION_NAME, avl_event.VALIDITY
    FROM avl_event
    WHERE avl_event.CREATED_AT>='2010-01-05 05:00:00'
      AND avl_event.CREATED_AT<='2010-01-06 04:59:00'
      AND avl_event.EVENT_TYPE_ID=2
    GROUP BY avl_event.VEHICLE_ID
    ORDER BY avl_event.CREATED_AT ASC
    Elle me récupère tous les évènements de type 2 et les groupe par véhicule.

    Le problème, c'est que je ne sais pas quel élément j'ai récupéré.
    Mon idée est de récupéré tous les premiers éléments, en utilisant created_date comme référence.

    Je veux avoir un tableau avec tous les premiers évènements de la journée de type 2 et leur véhicules associés.

    Est ce que quelqu'un voit comment faire ca ?
    Je sèche un peu sur le coup. Un having peut être mais bon...

    Merci
    Pierre

  2. #2
    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 786
    Points
    30 786
    Par défaut
    Apparemment, tu n'utilises pas un SGBD respectueux de la syntaxe du langage SQL normalisé. En particulier, toutes les colonnes ne faisant pas l'objet d'une fonction de regroupement dans le SELECT devraient apparaîte dans la clause GROUP BY.
    Or il n'y a aucune fonction de regroupement dans ta requête, donc aucune raison d'avoir une clause GROUP BY.

    Tu ne précises pas quel est la clé primaire de ta table, je suppose que c'est ID mais que (VEHICLE_ID, EVENT_TYPE_ID, CREATED_AT) est suffisamment discriminant pour être utilisé comme identifiant...
    Tu recherches donc dans ta table, pour chaque VEHICLE_ID, la plus faible valeur de CREATED_AT quand EVENT_TYPE_ID vaut 2

    La requête ressemblerait donc à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SELECT  SQL_NO_CACHE
            evt.ID
        ,   evt.VEHICLE_ID
        ,   evt.DRIVER_ID
        ,   evt.EVENT_TYPE_ID
        ,   evt.CREATED_AT
        ,   evt.MESSAGE
        ,   evt.RECEIVED
        ,   evt.LONGITUDE
        ,   evt.QUADRANT_LONG
        ,   evt.LATITUDE
        ,   evt.QUADRANT_LAT
        ,   evt.HEADING
        ,   evt.SPEED
        ,   evt.LOCATION_NAME
        ,   evt.VALIDITY
    FROM    avl_event   AS evt
    WHERE   EXISTS
            (   SELECT  1
                FROM    avl_event   AS tmp
                WHERE   tmp.CREATED_AT >= '2010-01-05 05:00:00'
                    AND tmp.CREATED_AT <= '2010-01-06 04:59:00'
                    AND tmp.EVENT_TYPE_ID = evt.EVENT_TYPE_ID
                    AND tmp.VEHICLE_ID  = evt.VEHICLE_ID
                GROUP BY tmp.VEHICLE_ID
                HAVING  MIN(tmp.CREATED_AT) = evt.CREATED_AT
            )   
        AND evt.EVENT_TYPE_ID = 2
    ORDER BY evt.CREATED_AT ASC
    ;
    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.

  3. #3
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Merci.

    Malheureusement, c'est des requêtes imbriquées difficiles a mettre en place avec propel...

    Je vais essayer de fouiller un peu de ce coté la ou d'aller chercher une autre méthode(algo différent peut être...)

    Merci en tout cas.

Discussions similaires

  1. Afficher les rendez vous par date
    Par Romantic_a dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 20/05/2008, 11h11
  2. Comment afficher un champ par date dans un intervalle
    Par KING_OF_GRACELAND dans le forum SQL
    Réponses: 13
    Dernier message: 12/03/2008, 10h38
  3. Regroupement par date dans une requete access
    Par ifrpi dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 08/02/2008, 03h32
  4. Afficher une fiche client par selection dans une Liste
    Par Pascal26 dans le forum WinDev
    Réponses: 2
    Dernier message: 10/04/2007, 11h16
  5. [SQL-VBA]tri par date dans access
    Par Mickey_Mouse dans le forum VBA Access
    Réponses: 5
    Dernier message: 06/02/2007, 09h49

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