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 :

Supprimet ligne en double


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  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
    Vous pouvez utiliser la fonction FIRST :
    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
    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

  3. #3
    Membre averti
    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
    Par défaut
    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.

  4. #4
    Expert confirmé 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
    Par défaut
    Pour le delete je pense que c'est mieux d'utiliser la version analytique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 
                )
    /

  5. #5
    Membre averti
    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
    Par défaut
    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.

  6. #6
    Membre averti
    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
    Par défaut
    La solution proposée par mnitu marche à merveille

    Merci beaucoup.

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

Discussions similaires

  1. Supprimer les lignes en double
    Par illight dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/09/2007, 19h43
  2. Supprimer des lignes en double.
    Par Empty_body dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/06/2007, 14h45
  3. [MySql] Une ligne en double
    Par philippef dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/11/2006, 23h58
  4. Supprimer ligne en double
    Par azman0101 dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/06/2004, 17h53
  5. Lignes en double dans le résultat d'une jointure
    Par ledevelopeur dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2004, 18h10

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