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

SQL Oracle Discussion :

Récupération sans doublon


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Récupération sans doublon
    Bonjour à tous,

    J'ai dans un table "RA" une colonne ID. Ici ID est unique

    Dans une seconde table "ASG" une colonne ID dans laquelle on retrouve l'ID de la table RA mais que l'on peut retrouver plusieurs fois..
    On a aussi un autre champ stamp qui est une date.

    Ex:
    dans table RA :
    ID000001
    ID000002
    ID000003
    ...

    dans table ASG :
    ----ID-----------------Stamp
    ID000001- - - - - - - 2011/01/20
    ID000001- - - - - - - 2010/12/21
    ID000002- - - - - - - 2010/03/15
    ID000003- - - - - - - 2010/07/08
    ID000003- - - - - - - 2010/07/12
    ID000003- - - - - - - 2010/08/11


    Ma question :
    Comment retourner les ID de la table RA (+ d'autres champs) en faisant une jointure sur la table ASG (par ID) et en ne retournant que les lignes dont la date est la plus "jeune".

    NOTA : Stamp ne fait pas partie des champs retournés mais uniquement utilisé dans la clause WHERE.

    Merci de votre aide.

  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 394
    Points
    18 394
    Par défaut
    Avec la fonction row_number :
    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
    With ASG as -- Vos données
    (  
    select 'ID000001' as ID_RA, date '2011-01-20' as STAMP from dual union all
    select 'ID000001'         , date '2010-12-21'          from dual union all
    select 'ID000002'         , date '2010-03-15'          from dual union all
    select 'ID000003'         , date '2010-07-08'          from dual union all
    select 'ID000003'         , date '2010-07-12'          from dual union all
    select 'ID000003'         , date '2010-08-11'          from dual
    )
      ,  SR as
    (
    select id_ra, stamp,
           row_number() over(partition by id_ra order by stamp desc) as rn
      from asg
    )
    select id_ra, stamp
      from SR
     where rn = 1;
     
    ID_RA    STAMP     
    -------- ----------
    ID000001 2011-01-20
    ID000002 2010-03-15
    ID000003 2010-08-11
    Edit : Une précision quand même : l'utilité de la fonction de fenêtrage n'est avérée qu'en fonction des autres colonnes dont vous allez avoir besoin, peut-être qu'un simple agrégat aurait suffit.

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT ID, FIRST_VALUE (STAMP)  OVER (PARTITION BY ID ORDER BY STAMP DESC) FROM RA

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Merci pour ces réponses.

    Dans les 2 cas apparemment je suis obligé de sélectionner le champ stamp dans le SELECT or ce n'est pas une info voulue comme retournée.

    Ai-je vraiment le choix si je souhaite parvenir au résultat escompté ?

    Merci

  5. #5
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    ca change le besoin !
    Donne un exemple de ce que tu veux avoir !
    Un seul id (correspondant au 'STAMP' le plus récent ) ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Oui c'est ça.
    Je souhaite récupérer l'ID dont le STAMP est le plus récent.

    Dans mon exemple initial ça donnerait :

    dans table RA :
    ID000001
    ID000002
    ID000003
    ...

    dans table ASG :
    ----ID-----------------Stamp
    ID000001- - - - - - - 2011/01/20
    ID000001- - - - - - - 2010/12/21
    ID000002- - - - - - - 2010/03/15
    ID000003- - - - - - - 2010/07/08
    ID000003- - - - - - - 2010/07/12
    ID000003- - - - - - - 2010/08/11

    résultat attendu :
    ID000001- - - - - - - 2011/01/20
    ID000002- - - - - - - 2010/03/15
    ID000003- - - - - - - 2010/08/11

  7. #7
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Alors, sauf erreur, les réponses données sont correctes !!!!! (OVER PARTITION)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Pardon. Je me suis mal exprimé.

    Les données à retourner sont uniquement les ID mais pas les stamps.

    Merci pour votre aide.

  9. #9
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    C'est incompréhensible !!!!!!
    Si tu ne veux que les id, pourquoi faire une sélection sur la date 'la plus jeune' ??????
    Un simple requete comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select distinct id from asg
    ne suffirait-elle pas ?
    PS : C'est en contradiction avec ta demande !!!
    résultat attendu :
    ID000001- - - - - - - 2011/01/20
    ID000002- - - - - - - 2010/03/15
    ID000003- - - - - - - 2010/08/11

  10. #10
    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 394
    Points
    18 394
    Par défaut
    L'incompréhension vient d'ici je pense :
    Comment retourner les ID de la table RA (+ d'autres champs)
    Comme dans votre exemple les autres champs n'existent pas, j'ai utilisé STAMP pour les simuler. Mais rien n'empêche de ne pas le sélectionner et de prendre les autres colonnes :
    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
    WITH ASG AS -- Vos données
    (  
    SELECT 'ID000001' AS ID_RA, 'AA' as COL, date '2011-01-20' AS STAMP FROM dual union ALL
    SELECT 'ID000001'         , 'AB'       , date '2010-12-21'          FROM dual union ALL
    SELECT 'ID000002'         , 'BA'       , date '2010-03-15'          FROM dual union ALL
    SELECT 'ID000003'         , 'CA'       , date '2010-07-08'          FROM dual union ALL
    SELECT 'ID000003'         , 'CB'       , date '2010-07-12'          FROM dual union ALL
    SELECT 'ID000003'         , 'CC'       , date '2010-08-11'          FROM dual
    )
      ,  SR AS
    (
    SELECT id_ra, col, 
           row_number() over(partition BY id_ra ORDER BY stamp DESC) AS rn
      FROM asg
    )
    SELECT id_ra, col
      FROM SR
     WHERE rn = 1;
     
    ID_RA    COL
    -------- ---
    ID000001 AA
    ID000002 BA
    ID000003 CC

  11. #11
    Membre à l'essai
    Homme Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Je voulais présenter la chose de manière simple mais au final ça embrouille tout le monde

    Dans mon select je requête sur les 2 tables (RA et ASG).

    Je dois aller chercher des infos autres que celle présentées ici dans les 2 tables.

    Une en particulier qui est le nom d'un bonhomme dans la table ASG.
    OR je ne dois récupérer le nom du gars dont la date est la plus jeune dans la table ASG.

    Pour compléter ce que dit précedemment :
    dans table RA :
    ID000001
    ID000002
    ID000003
    ...

    dans table ASG :
    ----ID-----------------Stamp--------user
    ID000001- - - - - - - 2011/01/20-----roger
    ID000001- - - - - - - 2010/12/21-----michel
    ID000002- - - - - - - 2010/03/15-----dédé
    ID000003- - - - - - - 2010/07/08-----dédé
    ID000003- - - - - - - 2010/07/12-----robert
    ID000003- - - - - - - 2010/08/11-----michel

    Je dois récupérer les ID et les bonhommes et ici ce serait :
    ID000001-----roger
    ID000002-----dédé
    ID000003-----michel

    J'espère que c'est plus clair.

  12. #12
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Voir la solution de waldar en remplacant 'COL' par user !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id_ra, user  FROM (
    SELECT id_ra, user, 
           row_number() over(partition BY id_ra ORDER BY stamp DESC) AS rn
      FROM asg
    )
     WHERE rn = 1;

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Un simple group by suffit
    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
     
    SQL> With RA As (
      2    Select 'ID000001' As id from dual union all
      3    Select 'ID000002'       from dual union all
      4    Select 'ID000003'       from dual
      5  ),
      6  Asg As (
      7    Select 'ID000001' As id, date '2011-01-20' As stamp, 'roger' as nom From dual union all
      8    Select 'ID000001',       date '2010-12-21',          'michel'       From dual union all
      9    Select 'ID000002',       date '2010-03-15',          'dédé'       From dual union all
     10    Select 'ID000003',       date '2010-07-08',          'dédé'       From dual union all
     11    Select 'ID000003',       date '2010-07-12',          'robert'       From dual union all
     12    Select 'ID000003',       date '2010-08-11',          'michel'       From dual
     13  )
     14  Select a.id, Max(Nom) Keep (Dense_Rank Last Order by b.stamp) Nom
     15    From RA a
     16         Join
     17         ASG b
     18     On a.id = b.id
     19  Group By a.id
     20  /
     
    ID       NOM
    -------- ------
    ID000001 roger
    ID000002 dédé
    ID000003 michel

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

Discussions similaires

  1. Probleme formulaire sans doublon...
    Par sentenza dans le forum IHM
    Réponses: 6
    Dernier message: 09/02/2006, 12h29
  2. Requête de soustraction sans doublons
    Par waloon dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/01/2006, 23h22
  3. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 12h43
  4. [Postgresql] insertion sans doublon
    Par Pwill dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/06/2005, 11h37
  5. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56

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