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 :

Select dernière date


Sujet :

Langage SQL

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Select dernière date
    Bonjour

    J'ai une table contenant plusieurs colonnes . Pour simplifier, voici les principales

    Key
    Comment
    Date
    Value

    Pour chaque Key je peux avoir un et un seul record par Date

    Comment puis-je faire un select des derniers records de chaque key
    Je veux dire pour chaque key, selecter le record ayant la date la plus grande ?

    Est-ce possible en SQL ou dois je le faire par programmation ?

    Merci de vos conseils

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonsoir,

    Je vous propose de la faire avec une anti-jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select *
     from MaTable T
     where not exists
          (select 1
            from MaTable T2
           where T2.key = T.key
             and T2."Date" > T."Date")
    Variante avec une semi jointure, moins performante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select *
     from MaTable T
     where T."Date" =
          (select max(T2."Date")
            from MaTable T2
           where T2.key = T.key)

    Cdlt,
    OD

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Troisième solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T1.KEY, T1.MA_DATE, t1.MES_AUTRES_COLONNES
     FROM MaTable T1
    inner join 
        (SELECt T2.KEY, MAX(T2.MA_DATE) as MAX_DATE
        from Matable T2
        group  by T2.KEY, T2.MA_DATE) AS T3
    on T1.KEY=T3.KEY
    and T1.MA_DATE=T3.MAX_DATE
    Comme tu vois à la question est-ce possible en SQL la réponse est oui et en plus tu as le choix.
    Soazig

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci soazig et Olivier Dufour
    Mais je ne suis pas encore convaincu

    La solution de Soazig semble la plus logique, je l'ai essayé mais le résultat c'est la table entiere !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    use ZIStat;
    SELECT *
     FROM Prices T1
    INNER JOIN 
        (SELECT T2.TraderCode, MAX(T2.[DATE]) AS MAX_DATE
        FROM Prices T2
        GROUP  BY T2.TraderCode, T2.[DATE]) AS T3
    ON T1.TraderCode=T3.TraderCode AND T1.[DATE]=T3.MAX_DATE
    Pour le moment je fais donc un Order By Tradercode, Date Desc et je filtre le resultat par programmation, la au moins je maitrise

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Je pense que j'ai trouvé la bonne methode ...

    Quel est l'avis des spécialistes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select *
    from 
    (
    select *, row_no = row_number() over (partition by TraderCode,MatchKey order by Date desc)
    from Prices
    ) i
    where i.row_no = 1

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    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 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci soazig et Olivier Dufour
    Mais je ne suis pas encore convaincu

    La solution de Soazig semble la plus logique, je l'ai essayé mais le résultat c'est la table entiere !!
    En effet, la requête proposée par Soazig contient une légère erreur (postée trop vite ?)

    Il fallait lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    use ZIStat;
    SELECT *
     FROM Prices T1
    INNER JOIN 
        (SELECT T2.TraderCode, MAX(T2.[DATE]) AS MAX_DATE
        FROM Prices T2
        GROUP  BY T2.TraderCode) AS T3
    ON T1.TraderCode=T3.TraderCode AND T1.[DATE]=T3.MAX_DATE
    Quand à la requête que tu utilises, je ne suis pas certain qu'elle soit la plus efficace et la moins coûteuse.

    Une autre solution est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  *
    FROM    MaTable T
    WHERE   EXISTS
            (   SELECT  1
                FROM    MaTable T2
                WHERE   T2.KEY = T.KEY
                HAVING  MAX(T2.MaDate) = T.MaDate
            )

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour Al1_24

    Quand à la requête que tu utilises, je ne suis pas certain qu'elle soit la plus efficace et la moins coûteuse.
    Tu parle de ma requete utilisant le partition by ?

    Je ne l'ai pas testé sur des tres grosse table mais je la trouve syntaxiquement asser simple et lisible

    J'ai comparé l'execution plan de ta methode et de la mienne

    La tienne prends 91% en Clustered index seek
    La mienne 81% en sort

    Je ne sais pas quel est le moindre cout ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bonjour

    Pour chaque Key je peux avoir un et un seul record par Date

    Je veux dire pour chaque key, selecter le record ayant la date la plus grande ?
    Bonjour,
    D'après l'énoncé chaque valeur de Key n'a qu'une date, donc pour chaque Key le dernier record est le seul existant...

    Ou alors je n'ai pas les yeux en face des trous...

    Tatayo.

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci tayato

    Je me suis sans doute pas tres bien exprimé mais al1_24, soazig et olivier dufour avaient heureusement compris

    Je voulais dire que pour chaque Key je peux avoir plusieurs records a des dates différentes le but est de ne selecter que UN et UN SEUL record par key et celui qui a la date la plus récente (dans la plus grande)

    N.B. Je viens de faire un petit test entre la proposition de al1_24 et le Partition By sur une table de 500000 records : il n'y a pas photo : apres 10 minutes Mng studio affichait toujours "executing query" pour la requete Where Exists proposée par al1_24
    Tandis que la requete partition by a mis 3 secondes

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Mea culpa comme l'a vu al1_24, il ne fallait pas mettre de la date dans le group by de la requête que j'ai proposée sinon la sous requête ne servait à rien.
    Désolée.
    Soazig

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Soazig

    Je viens d'essayer ta methode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    USE ZIStat;
    SELECT *
     FROM Prices T1
    INNER JOIN 
        (SELECT T2.TraderCode, MAX(T2.[DATE]) AS MAX_DATE
        FROM Prices T2
        GROUP  BY T2.TraderCode) AS T3
    ON T1.TraderCode=T3.TraderCode AND T1.[DATE]=T3.MAX_DATE
    Elle est aussi tres rapide mais malheureusement elle peut donner des doubles sur une meme date

    Donc en définitive, le best c'est le over partition by

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    mais malheureusement elle peut donner des doubles sur une meme date
    J'avais compris que pour un TraderCode, une date il n'y avait qu'une seule ligne.

    Si tu as deux lignes correspondant à un TraderCode et à la date max tu veux laquelle dans ton résultat?
    A+
    Soazig

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Soazig

    Si tu as deux lignes correspondant à un TraderCode et à la date max tu veux laquelle dans ton résultat
    Ca depend evidement du contexte mais ce qui me semble c'est que cette situation est plus confortable a gerer avec le partition by qu'avec le inner join

Discussions similaires

  1. select dernière ligne...
    Par ludophil dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/05/2009, 21h09
  2. select sur la dernière date
    Par Oraman dans le forum Oracle
    Réponses: 21
    Dernier message: 09/11/2006, 15h23
  3. Select la date la plus récente
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2005, 16h45
  4. [SQL] selection des dates en ne distinguant pas l'heure
    Par meufeu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/06/2005, 11h29
  5. selection par date
    Par adgabd dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/01/2004, 10h28

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