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

MS SQL Server Discussion :

Récupérer l'ID le plus récent


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 43
    Par défaut Récupérer l'ID le plus récent
    Bonjour à tous,

    Voilà je viens vous voir car je n'arrives pas vraiment à obtenir le résultat que je souhaiterais pour une requete SQL.

    En gros j'ai une table comme ceci :

    ID | Label |
    1 | Camion |
    2 | Camion |
    3 | Voiture |
    4 | Moto |
    5 | Moto |
    6 | Camion |

    PS : Mon champ ID est autoIncrément, du coup le dernier enregistrement rentré est le plus récent.

    Mon souhait serait de récupérer, pour chaque label distinct, la ligne la plus récente.
    Dans notre exemple, ca donnerait donc ceci :


    ID | Label |
    3 | Voiture |
    5 | Moto |
    6 | Camion |

    J'espère que je suis assez compréhensible...

    Je n'ai pas vraiment d'idée pour réaliser ça, je suis légèrement perdu

    D'avance merci pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Si la règle correspond bien à l'id maximum pour chaque catégorie, un simple agrégat suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      select max(id) as id, label
        from MaTable
    group by label

  3. #3
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 43
    Par défaut
    Merci pour ton aide Waldar.

    Malheureusement, en voulant simplifier au maximum mon exemple j'ai oublié de préciser que j'avais des valeurs pour ces labels.

    Un peu comme ceci :

    ID | Label | Valeur | Date
    1 | Camion | Bleu |
    2 | Camion | Rouge |
    3 | Voiture | Vert |
    4 | Moto | Noir |
    5 | Moto | Bleu |
    6 | Camion | Violet |

    Mais à la limite je peux faire une aggrégation sur seulement mes 2 premiers champs et refaire un left join avec ma table entière, non ?

    Je vais voir à ca

  4. #4
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 43
    Par défaut
    Problème résolu en faisant un LEFT JOIN avec la requete donnée précédemment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT max(id) AS id, label
        FROM MaTable
    GROUP BY label
    Merci beaucoup

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Vous pouvez même faire une jointure forte, voire un IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
      FROM MaTable
     WHERE id IN (  SELECT max(id)
                      FROM MaTable
                  GROUP BY label);

  6. #6
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 43
    Par défaut
    Question bonus :

    Est-ce possible de faire une condition sur la jointure ?

    J'entend par la d'avoir un boolean qui me dit "Avoir les plus récents", et faire ma jointure (ou mon WHERE id IN ...) en fonction de ce boolean ?

    Une procédure du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @A as bit
    set @A = 0
     
    select * from produits
     
    if @A = 0
    begin 
    inner join  blablabla
    end
    Ou alors je dois faire un copier/coller de ma procédure et faire un IF...ELSE... avec 2 traitements quazy identiques mais avec un WHERE différent ?

    En tout cas merci pour votre aide

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Là je n'ai pas compris votre question !

  8. #8
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 43
    Par défaut
    Pas évident pour expliquer sur un forum

    En gros j'ai 2 procédures, une qui me permet d'avoir mes labels les plus récents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from produits where prod.id IN (blabla)
    Et une autre qui me donne l'ensemble des produits :

    Ma question était de savoir s'il était possible qu'au lieu de faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE @A as bit
    SET @A = 0
     
    if @A = 0
    select * from produits
    else
    select * from produits where prod.id IN (blabla)
    ...On pouvait faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @A AS bit
    SET @A = 0
     
    SELECT * FROM produits
    IF @A = 0
    begin 
    WHERE prod.id IN (blabla)
    end
    C'est juste rajouter la condition WHERE par rapport à la valeur de mon boolean @A, sans devoir retaper l'ensemble de la procédure (SELECT * FROM produits).

    A mon avis pour faire ca on doit passer par un sp_execute, mais bon on sait jamais

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Effectivement vous aurez besoin de faire appel à sp_executeSQL pour faire cela

    @++

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    Nicolas la chaleur moite de la Thaïlande embrume ton cerveau !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM   produits
    WHERE  (prod.id IN (blabla) AND @A = 0)
       OR  (@A <> 0)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [VxiR2] Dans une colonne récupérer la date la plus récente
    Par BipBipBO dans le forum Deski
    Réponses: 10
    Dernier message: 06/01/2024, 15h55
  2. [VxiR2] Comment récupérer la version la plus récente?
    Par tibaldo13 dans le forum Designer
    Réponses: 5
    Dernier message: 03/02/2011, 10h15
  3. Récupérer la ligne la plus récente
    Par DeezerD dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/04/2007, 13h13
  4. récupérer le fichier le plus récent
    Par kifouillou dans le forum Langage
    Réponses: 24
    Dernier message: 26/01/2007, 00h04
  5. [MySQL 3.23] Récupérer la date la plus récente
    Par griese dans le forum Langage SQL
    Réponses: 10
    Dernier message: 19/12/2006, 14h19

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