Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2011, 17h06   #1
Invité régulier
 
Homme Jean-Fabien Curie
Consultant informatique
Inscription : mars 2007
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Jean-Fabien Curie
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2007
Messages : 22
Points : 8
Points : 8
Envoyer un message via Skype™ à Patoune
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.
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h12   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec la fonction row_number :
Code :
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.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h15   #3
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Code :
1
2
 
SELECT DISTINCT ID, FIRST_VALUE (STAMP)  OVER (PARTITION BY ID ORDER BY STAMP DESC) FROM RA
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h23   #4
Invité régulier
 
Homme Jean-Fabien Curie
Consultant informatique
Inscription : mars 2007
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Jean-Fabien Curie
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2007
Messages : 22
Points : 8
Points : 8
Envoyer un message via Skype™ à Patoune
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
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h27   #5
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
ca change le besoin !
Donne un exemple de ce que tu veux avoir !
Un seul id (correspondant au 'STAMP' le plus récent ) ?
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h36   #6
Invité régulier
 
Homme Jean-Fabien Curie
Consultant informatique
Inscription : mars 2007
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Jean-Fabien Curie
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2007
Messages : 22
Points : 8
Points : 8
Envoyer un message via Skype™ à Patoune
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
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h38   #7
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Alors, sauf erreur, les réponses données sont correctes !!!!! (OVER PARTITION)
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 11h45   #8
Invité régulier
 
Homme Jean-Fabien Curie
Consultant informatique
Inscription : mars 2007
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Jean-Fabien Curie
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2007
Messages : 22
Points : 8
Points : 8
Envoyer un message via Skype™ à Patoune
Pardon. Je me suis mal exprimé.

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

Merci pour votre aide.
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 11h53   #9
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
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 :
1
2
 
SELECT DISTINCT id FROM asg
ne suffirait-elle pas ?
PS : C'est en contradiction avec ta demande !!!
Citation:
résultat attendu :
ID000001- - - - - - - 2011/01/20
ID000002- - - - - - - 2010/03/15
ID000003- - - - - - - 2010/08/11
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 12h15   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
L'incompréhension vient d'ici je pense :
Citation:
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 12h22   #11
Invité régulier
 
Homme Jean-Fabien Curie
Consultant informatique
Inscription : mars 2007
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Jean-Fabien Curie
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2007
Messages : 22
Points : 8
Points : 8
Envoyer un message via Skype™ à Patoune
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.
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h04   #12
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Voir la solution de waldar en remplacant 'COL' par user !
Code :
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;
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 14h12   #13
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Un simple group by suffit
Code :
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h08.


 
 
 
 
Partenaires

Hébergement Web