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 :

Grouper des valeurs par date


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Par défaut Grouper des valeurs par date
    Bonjour,

    J'ai un gros souci à résoudre.

    J'ai une table Messages avec comme champs
    dt_message ; id_sujet

    Je voudrais afficher le dernier message de chaque sujet (id_sujet) dans une page.

    J'ai fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Messages group by id_sujet order dt_message desc

    Le souci, c'est qu'il ne prend pas la dernière date (dt_message) à cause du group by :S

    Que puis je faire ?

    Merci beaucoup !!!

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Si vous travaillez avec SQL Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @T TABLE
    (
     id_sujet INT,
     dt_message DATETIME
    );
     
    INSERT @T VALUES (1, '20100101');
    INSERT @T VALUES (1, '20110101');
    INSERT @T VALUES (2, '20100303');
    INSERT @T VALUES (2, '20100606');
    INSERT @T VALUES (2, '20101010');
    1ere solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
     T.id_sujet,
     (SELECT TOP 1 dt_message
      FROM @T AS T2
      WHERE T2.id_sujet = T.id_sujet
      ORDER BY T2.dt_message DESC) AS dt_message
    FROM @T AS T
    GROUP BY id_sujet;
    2eme solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH CTE
    AS
    (
     SELECT 
      ROW_NUMBER() OVER(PARTITION BY id_sujet ORDER BY dt_message DESC) AS num,
      *
     FROM @T
    )
    SELECT 
     id_sujet,
     dt_message
    FROM CTE
    WHERE num = 1;
    3eme solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT 
     T.id_sujet, C.dt_message
    FROM @T AS T
    CROSS APPLY (
     SELECT TOP 1 T2.dt_message
     FROM @T AS T2
     WHERE T.id_sujet = T2.id_sujet
     ORDER BY T2.dt_message DESC
    ) AS C
    A voir en fonction de la volumétrie que vous aurez à traiter

    ++

  3. #3
    Membre éclairé Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Par défaut
    Moi je vais rajouter des numéro de pages.
    Lz solution la plus légère selon toi ? Merci

  4. #4
    Membre éclairé Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Par défaut
    Je viens d'essayer les 3 solutions et elles retournent toutes des erreurs.

    Solution 1 :
    Erreur de syntaxe près de '1 dt_message
    FROM @T AS T2
    WHERE T2.id_sujet = T.id_sujet
    ' à la ligne 3
    Solution 2 :
    Erreur de syntaxe près de 'WITH CTE
    AS
    (
    SELECT
    ROW_NUMBER() OVER(PARTITION BY id_s' à la ligne 1
    Solution 3 :
    Erreur de syntaxe près de '@T AS T
    CROSS APPLY (
    SELECT TOP 1 T2.dt_message
    FROM @T AS' à la ligne 3
    Aurais je pas de chance LOL

    Merci

  5. #5
    Membre éclairé Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Par défaut
    J'ai oublié de préciser que je travaille avec MySQL

  6. #6
    Membre éclairé Avatar de PIEPLU
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    507
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 507
    Par défaut
    Si j'ai bien compris, je pense que c'est ça que je voudrais:
    http://www.developpez.net/forums/d41...by/#post283552

    J'ai bien essayé mais j'ai pas réussi à le mettre en place !!

    merci

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Problème maintes fois évoqué !

    Quelle est le dernier message par sujet ?
    Apparemment, dans votre cas, c'est la colonne (et pas champ ! ) dt_message qui permet de le savoir.
    dt = date ? Si oui, pourquoi ne pas avoir appelé la colonne date_message ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_sujet, MAX(dt_message) AS dt_max
    FROM Messages
    GROUP BY id_sujet
    Ensuite on récupère les autres colonnes souhaitées correspondant à cette dt_max en faisant une jointure de cette requête avec la table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT les_colonnes_souhaitees_et_pas_etoile
    FROM Messages m
    INNER JOIN
    (
      SELECT id_sujet, MAX(dt_message) AS dt_max
      FROM Messages
      GROUP BY id_sujet
    ) tmp 
      ON tmp.id_sujet = m.id_sujet
      AND tmp.dt_max = m.dt_message
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Grouper des donnees par valeur d'une donnee
    Par yaya_la_rafale dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 23/04/2015, 10h27
  2. Grouper des valeurs par statut le plus récent
    Par Yohan G. dans le forum Webi
    Réponses: 2
    Dernier message: 17/12/2013, 12h01
  3. Ecraser des valeurs avec Dates identiques
    Par beurnoir dans le forum Access
    Réponses: 10
    Dernier message: 25/10/2005, 09h47
  4. Classer des messages par date ET par pertinence
    Par pocpoc2 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 04/07/2005, 10h54
  5. [CR] Grouper des minutes par cinq et non une par une.
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 14/09/2004, 13h45

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