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 :

extraire la date au plus tard


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut extraire la date au plus tard
    Bonjour

    J'ai une table avec SQL SERVER 2000 qui contient les colonnes et données suivantes :

    Nom Date_Heure

    Steve 27/07/2009 15:21:35
    Steve 27/07/2009 14:15:57
    Steve 27/07/2009 18:16:58
    Steve 27/07/2009 19:15:57
    Daniel 12/08/2009 10:15:54
    Daniel 12/08/2009 12:18:42
    Daniel 12/08/2009 14:17:53
    Daniel 12/08/2009 18:19:02
    J'aimerai faire un select pour extraire pour chaque personne la date la plus tard.

    Comme dans cet exemple je cherche à avoir le résutltat suivant :

    Steve 27/07/2009 19:15:57
    Daniel 12/08/2009 18:19:02
    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT Nom, max(Date_Heure)
        FROM MaTable
    GROUP BY Nom

  3. #3
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Il faut utiliser la fonction MAX() et regrouper par nom.

    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
    SET DATEFORMAT dmy;
    GO
     
    DECLARE @t TABLE
    (
     nom VARCHAR(50),
     Date_Heure DATETIME
    );
     
    INSERT INTO @t VALUES ('Steve','27/07/2009 15:21:35');
    INSERT INTO @t VALUES ('Steve', '27/07/2009 14:15:57');
    INSERT INTO @t VALUES ('Steve', '27/07/2009 18:16:58');
    INSERT INTO @t VALUES ('Steve', '27/07/2009 19:15:57');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 10:15:54');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 12:18:42');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 14:17:53');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 18:19:02');
     
    SELECT nom,MAX(Date_heure) AS max_date_heure
    FROM @t
    GROUP BY nom;
    ++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT Nom, max(Date_Heure)
        FROM MaTable
    GROUP BY Nom
    Merci Waldar ca marche bien.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Bonsoir,

    Il faut utiliser la fonction MAX() et regrouper par nom.

    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
    SET DATEFORMAT dmy;
    GO
     
    DECLARE @t TABLE
    (
     nom VARCHAR(50),
     Date_Heure DATETIME
    );
     
    INSERT INTO @t VALUES ('Steve','27/07/2009 15:21:35');
    INSERT INTO @t VALUES ('Steve', '27/07/2009 14:15:57');
    INSERT INTO @t VALUES ('Steve', '27/07/2009 18:16:58');
    INSERT INTO @t VALUES ('Steve', '27/07/2009 19:15:57');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 10:15:54');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 12:18:42');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 14:17:53');
    INSERT INTO @t VALUES ('Daniel', '12/08/2009 18:19:02');
     
    SELECT nom,MAX(Date_heure) AS max_date_heure
    FROM @t
    GROUP BY nom;
    ++
    Merci MikeDavem, ca donne le bon résultat.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Merci Waldar ca marche bien.
    Juste une petite sous-question

    Si j'avais une troisième colonne sur laquelle je ne veux faire aucun traitement (pas de groupage), mais je veux juste l'afficher dans mes résultas. Le requête suivante me donne une erreur sur cette nouvelle colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Nom, max(Date_Heure), origine
        FROM MaTable
    GROUP BY Nom

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Si il n'existe qu'une origine par nom, tu peux regrouper également par origine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Nom, max(Date_Heure), origine
    FROM MaTable
    GROUP BY Nom, origine
    Sinon, tu peux utilisé une réponse énoncée il y a peu par pacmann et que je te retranscris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM (
    SELECT Nom, Date_Heure, origine, row_number() over(partition BY Nom ORDER BY Date_heure DESC) rk 
    FROM MaTable
    )
    WHERE rk = 1
    Bon courage.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par bogue Voir le message
    Si il n'existe qu'une origine par nom, tu peux regrouper également par origine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Nom, max(Date_Heure), origine
    FROM MaTable
    GROUP BY Nom, origine
    Sinon, tu peux utilisé une réponse énoncée il y a peu par pacmann et que je te retranscris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM (
    SELECT Nom, Date_Heure, origine, row_number() over(partition BY Nom ORDER BY Date_heure DESC) rk 
    FROM MaTable
    )
    WHERE rk = 1
    Bon courage.
    Je veux que la colonne "origine" soit ignorée pour les traitements mais affichée dans le résultat. Exemple :

    Nom Date_Heure Origine

    Steve 27/07/2009 15:21:35 France

    Steve 27/07/2009 14:15:57 Belgique
    Steve 27/07/2009 18:16:58 Espagne
    Steve 27/07/2009 19:15:57 Canada
    Daniel 12/08/2009 10:15:54 Portugal
    Daniel 12/08/2009 12:18:42 Suisse
    Daniel 12/08/2009 14:17:53 Holland
    Daniel 12/08/2009 18:19:02 USA

    Voici le résultat que je cherche :

    Steve 27/07/2009 19:15:57 Canada
    Daniel 12/08/2009 18:19:02 USA

    Mais sans grouper sur la colonne "Origine"

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    La deuxième solution répond à votre attente.
    Elle ne prend pas en considération le champs origine.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par bogue Voir le message
    La deuxième solution répond à votre attente.
    Elle ne prend pas en considération le champs origine.
    Mais la fonction row_number() n'est pas reconnue par SQL SERVER 2000.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par bogue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM (
    SELECT Nom, Date_Heure, origine, row_number() over(partition BY Nom ORDER BY Date_heure DESC) rk 
    FROM MaTable
    )
    WHERE rk = 1
    Est-ce que tu peux m'expliquer ce que fait :

    - row_number()
    - over(partition BY Nom
    - rk
    - WHERE rk = 1

    Merci.

  12. #12
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    tu peux essayer quelque chose dans ce style si tu ne peux pas utiliser row_number() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select nom, date_heure,origine
    from maTable tab
    JOIN
    (SELECT Nom, max(Date_Heure) as heure_max
    FROM MaTable
    GROUP BY Nom) temp
    on tab.nom=temp.nom and tab.date_heure = temp.heure_max

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Au temps pour moi, row_number() n'est disponible qu'à partir de SQL Server 2005.

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

Discussions similaires

  1. [AC-2013] extraire les dates les plus récentes d'un enregistrement
    Par claireflore dans le forum Access
    Réponses: 1
    Dernier message: 02/08/2014, 06h56
  2. [AC-2007] Calculer une date au plutôt et au plus tard
    Par hyperion13 dans le forum Access
    Réponses: 2
    Dernier message: 24/04/2012, 14h50
  3. Réponses: 3
    Dernier message: 14/05/2009, 19h27
  4. Extraire la date la plus récente Database MYsql
    Par brazza dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/11/2004, 02h34

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