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 27/01/2011, 15h36   #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 Supprimet ligne en double

Bonjour à tous,

la requête s'effectuant sur une table, je souhaite en supprimer des lignes en double dès lors que le couple col1-col2 a les mêmes valeurs.
Dans ce cas, le couple col1-col2 retenu est celui dont le stamp est le plus grand.

Voici un extrait de la table :
col1----------------col2--------------stamp--------------user
14A00016355----14B00014902----20090319094013600----jean
14A00016355----14B00014902----20090319094919900----jansel
14A00016355----14B00014902----20090319082719300----fcourbot
14A00016355----14B00014902----20090223145657200----cflack
14A00016361----14B00014142----20090121101002100----van
14A00016366----14B00015580----20090121125849800----vieu
14A00016366----14B00015580----20090121130032300----vieu
14A00016366----14B00015580----20090121130228100----vieu
14A00016366----14B00015701----20090121125849800----vieu
14A00016366----14B00015701----20090121130228100----vieu
14A00016366----14B00015701----20090121130032300----dinar

Le résultat escompté est:
14A00016355----14B00014902----20090319094919900----jansel
14A00016361----14B00014142----20090121101002100----van
14A00016366----14B00015580----20090121130228100----vieu
14A00016366----14B00015701----20090121130228100----vieu

en essayant le code suivant:
Code :
1
2
3
SELECT DISTINCT col1, col2, max(stamp),user
FROM matable
GROUP BY col1,col2,user
Cela me retourne encore des lignes en double.

Pourriez-vous me dire ce qu'il faut changer dans la requete.

Merci.
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 15h51   #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
Vous pouvez utiliser la fonction FIRST :
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
WITH matable AS
(
SELECT '14A00016355' AS col1, '14B00014902' AS col2, to_timestamp('20090319094013600', 'yyyymmddhh24missff') AS stamp, 'jean' AS usr FROM dual union ALL
SELECT '14A00016355'        , '14B00014902'        , to_timestamp('20090319094919900', 'yyyymmddhh24missff')         , 'jansel'      FROM dual union ALL
SELECT '14A00016355'        , '14B00014902'        , to_timestamp('20090319082719300', 'yyyymmddhh24missff')         , 'fcourbot'    FROM dual union ALL
SELECT '14A00016355'        , '14B00014902'        , to_timestamp('20090223145657200', 'yyyymmddhh24missff')         , 'cflack'      FROM dual union ALL
SELECT '14A00016361'        , '14B00014142'        , to_timestamp('20090121101002100', 'yyyymmddhh24missff')         , 'van'         FROM dual union ALL
SELECT '14A00016366'        , '14B00015580'        , to_timestamp('20090121125849800', 'yyyymmddhh24missff')         , 'vieu'        FROM dual union ALL
SELECT '14A00016366'        , '14B00015580'        , to_timestamp('20090121130032300', 'yyyymmddhh24missff')         , 'vieu'        FROM dual union ALL
SELECT '14A00016366'        , '14B00015580'        , to_timestamp('20090121130228100', 'yyyymmddhh24missff')         , 'vieu'        FROM dual union ALL
SELECT '14A00016366'        , '14B00015701'        , to_timestamp('20090121125849800', 'yyyymmddhh24missff')         , 'vieu'        FROM dual union ALL
SELECT '14A00016366'        , '14B00015701'        , to_timestamp('20090121130228100', 'yyyymmddhh24missff')         , 'vieu'        FROM dual union ALL
SELECT '14A00016366'        , '14B00015701'        , to_timestamp('20090121130032300', 'yyyymmddhh24missff')         , 'dinar'       FROM dual
)
  SELECT col1, col2, max(stamp) AS stamp,
         max(usr) keep(dense_rank first ORDER BY stamp DESC) AS usr
    FROM matable
GROUP BY col1 ,col2;
 
COL1        COL2        STAMP                     USR     
----------- ----------- ------------------------- --------
14A00016355 14B00014902 20090319094919900000000   jansel  
14A00016361 14B00014142 20090121101002100000000   van     
14A00016366 14B00015580 20090121130228100000000   vieu    
14A00016366 14B00015701 20090121130228100000000   vieu
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h24   #3
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 votre réponse.

Suis-je obligé de passer par la fonction to_timestamp pour ensuite calculer le max() ?

La colonne s'appelle comme cela mais en fait c'est un VARCHAR2.
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h32   #4
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
Pour le delete je pense que c'est mieux d'utiliser la version analytique
Code :
1
2
3
4
5
6
7
8
9
10
 
DELETE FROM matable 
WHERE rowid IN (SELECT rid
                FROM (SELECT rowid rid, 
                             row_number() over(partition BY col1, col2 ORDER BY stamp DESC) rn
                        FROM matable 
                     )
              WHERE rn <> 1 
            )
/
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h48   #5
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 vais essayer la version Mnitu car le pb que me pose le GROUP BY c'est que j'ai un vingtaine d'autres champs dans le SELECT.

Je ne les mets jamais pour ne pas "polluer" la discussion.
Patoune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h17   #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
La solution proposée par mnitu marche à merveille

Merci beaucoup.
Patoune 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 03h29.


 
 
 
 
Partenaires

Hébergement Web