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

PL/SQL Oracle Discussion :

Extraction ligne contigüe


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut Extraction ligne contigüe
    Bonjour,

    J'ai un script Pl/sql a faire.
    voici l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Libelle    date debut       date fin             pays          code
     
    FR       05/06/2004	 08/04/2010	         France          07
    FR       08/04/2010	 31/12/2950	         France          07
    Donnera en physique un seul enregistrement
    FR      05/06/2004	 31/12/2950	         France       07
    donc pour un meme libelle,meme pays et meme code je veux extraire les dates contigues(plus petite et plus grande
    Le but est d'alimenter une nouvelle table avec tous les enregistrements de l'ancienne table.


    Merci

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il faut utiliser les fonctions analytiques (Faq ou Tuto) et dans les posts.
    Ca a déjà été posé.

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Dans la même requête, tu mets la fonction min et max avec un group by adéquat.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Rebonjour,

    Je sais pas comment on fait.
    qqn peut m'envoyer un lien sur le forum ou un tuto?
    Merci

    Merci aux deux précédentes personnes qui m'ont répondu.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    voila ce que j'ai fait mais y'a un truc qui cloche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select ID_OBJET,C_PAYS,D_VAL,DAT_D_VAL from (
    	    select
    		   ID_OBJET,C_PAYS,D_VAL,DAT_D_VAL
    		   ,lag  (DAT_D_VAL)  over (partition by C_PAYS order by D_VAL,DAT_D_VAL) lag_end_validity
    		   ,lead (D_VAL)over (partition by C_PAYS order by D_VAL,DAT_D_VAL) lead_start_validity
    	    from PAYS
    ) where DAT_D_VAL = lead_start_validity
    order by 1,2,3
    ;

  6. #6
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Bonjour tous le monde,

    quelqu'un peut me guider?
    Merci infiniment.

  7. #7
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Il faut être simple.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with tab as
    (select 'FR'Libelle,to_date('05/06/2004','dd/mm/yyyy')date_debut,     to_date('08/04/2010','dd/mm/yyyy')    date_fin,          'France' pays,         '07'code from dual union 
     
    select 'FR',       to_date('08/04/2010','dd/mm/yyyy'),     to_date('31/12/2950','dd/mm/yyyy'),             'France'          ,'07' from dual union
    select 'ALG'Libelle,to_date('01/07/2004','dd/mm/yyyy')date_debut,     to_date('05/05/2005','dd/mm/yyyy')    date_fin,          'Algérie' pays,         '01'code from dual union 
     
    select 'ALG',       to_date('05/05/2005','dd/mm/yyyy'),    to_date( '10/10/2010','dd/mm/yyyy'),             'Algérie'          ,'01' from dual union
    select 'ALG',       to_date('10/10/2010','dd/mm/yyyy'),    to_date( '01/11/2300','dd/mm/yyyy')    ,         'Algérie'          ,'01' from dual
     
     
    )
    select Libelle,pays,code,min(date_debut),max(date_fin) from tab
    group by Libelle,pays,code


    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LIBELLE    PAYS    CODE    MIN(DATE_DEBUT)    MAX(DATE_FIN)
         FR       France     07      05/06/2004             31/12/2950
         ALG     Algérie     01      01/07/2004             01/11/2300

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Waldar, je pense qu'il souhaite regrouper des plages contiguës (quand date_debut = date_fin).

    http://www.developpez.net/forums/d12...e/#post6581910

  9. #9
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Je pense qu'il y'a un mal entendu.
    voila ce que je veux.
    Nom : date_contigue.png
Affichages : 399
Taille : 48,0 Ko

    et je voudrai donc la date de debut min et la date de fin max qui ont des dates de debut et fin contigues.
    biensur pour un pays, code et libellé.
    Merci

  10. #10
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    c'est ce que j' ai proposé.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with la_table as
    (select 'FR'Libelle,to_date('02/02/2010','dd/mm/yyyy')date_debut,     to_date('06/02/2010','dd/mm/yyyy')    date_fin,          'France' pays,         '07'code from dual union 
    select 'FR',       to_date('06/02/2010','dd/mm/yyyy'),     to_date('15/03/2011','dd/mm/yyyy'),             'France'          ,'07' from dual union
    select 'GB'Libelle,to_date('03/05/2004','dd/mm/yyyy')date_debut,     to_date('31/12/2014','dd/mm/yyyy')    date_fin,          'Grande Bretagne' pays,         '08'code from dual union 
    select 'FR',       to_date('15/03/2011','dd/mm/yyyy'),    to_date( '20/04/2012','dd/mm/yyyy'),             'France'          ,'07' from dual union
    select 'FR',       to_date('20/04/2012','dd/mm/yyyy'),    to_date( '31/05/2012','dd/mm/yyyy')    ,         'France'          ,'07' from dual
    )

    Tu n'a qu'exécuter la requête ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select Libelle,pays,code,min(date_debut),max(date_fin) from la_table
    group by Libelle,pays,code
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LIBELLE    PAYS                     CODE    MIN(DATE_DEBUT)    MAX(DATE_FIN)
    FR           France                   07         02/02/2010                31/05/2012
    GB          Grande Bretagne     08         03/05/2004                31/12/2014

  11. #11
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Mais tu l'as met ou la condition des dates contiguës(c'est à dire date de fin qui est égale a date de début du prochain enregistrement)?
    les trucs que j'ai coloré en rose.
    je ne peux pas prendre de date min ni max que si ma date de début d'un tuple quelconque égale à la date de fin de la date précédente.
    regarde l'exemple avec le premier tuple avec le deuxième.
    j'ai la date de fin du premier tuple à 06/02/2010 et la date de début du 2eme tuple a la même date(dans ce cas je prend le mix et le max et je continue ma recherche de tous les autres tuples).
    Merci infiniment.
    PS : Je dois faire l'insertion de cette table dans une nouvelle table que quand il y'a des dates contiguës sinon j’insère rien.

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 437
    Points
    28 437
    Par défaut
    Quelque chose dans ce gout là :
    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
    28
    29
    SELECT  deb.cle
        ,   deb.date_debut
        ,   fin.date_fin
    FROM    (   SELECT  tb1.cle
                    ,   tb1.date_debut
                    ,   RANK()  OVER (PARTITION BY tb1.cle ORDER BY tb1.date_debut) AS rang
                FROM    matable tb1
                WHERE   NOT EXISTS
                        (   SELECT  1
                            FROM    matable tb0
                            WHERE   tb0.cle         = tb1.cle
                                AND tb0.date_fin    = tb1.date_debut
                        )
            )   deb
        INNER JOIN
            (   SELECT  tb2.cle
                    ,   tb2.date_fin
                    ,   RANK()  OVER (PARTITION BY tb2.cle ORDER BY tb2.date_fin)   AS rang
                FROM    matable tb2
                WHERE   NOT EXISTS
                        (   SELECT  1
                            FROM    matable tb0
                            WHERE   tb0.cle         = tb2.cle
                                AND tb0.date_debut  = tb2.date_fin
                        )
            )   fin
            ON  deb.cle     = fin.cle
            AND deb.rang    = fin.rang
    ;
    Cette requête peut certainement être améliorée et optimisée, c'est un premier jet.

  13. #13
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Je n'arrive pas
    meme avec ton exemple.
    Je trouve que je patauge grave.
    Il faut que je comprenne le principe pr bien saisir.
    merci à celui qui peut m'expliquer petit à petit.
    Cordialement

  14. #14
    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 388
    Points
    18 388
    Par défaut
    Citation Envoyé par McM Voir le message
    Waldar, je pense qu'il souhaite regrouper des plages contiguës (quand date_debut = date_fin).
    Je plaide non-coupable votre honneur... ceci étant ma première intervention sur ce sujet !

  15. #15
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Merci Waldar,
    en attendant que qqn puisse me donner un coup de main.
    Je declare forfait.:-(

  16. #16
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bon, c'était plus compliqué que prévu.


    Le problème Tifsa c'est que tu ne donnes pas un jeu d'essai complet avec les cas que tu souhaites

    Voici mon jeu de test
    Pays FR (tout est contigu)
    02/02/2010 - 06/02/2010
    06/02/2010 - 15/03/2011
    15/03/2011 - 20/04/2012
    20/04/2012 - 31/05/2012

    Pays GB (2 plages contigues)
    02/02/2010 - 06/02/2010
    06/02/2010 - 15/03/2010

    15/03/2011 - 20/04/2012
    20/04/2012 - 31/05/2012

    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
    28
    WITH t1 AS
    (
    SELECT 'fr' lib, 7 code,  TO_DATE('02/02/2010', 'DD/MM/YYYY') AS dtedeb,TO_DATE('06/02/2010', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'fr' lib, 7 code,  TO_DATE('06/02/2010', 'DD/MM/YYYY') AS dtedeb,TO_DATE('15/03/2011', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'fr' lib, 7 code,  TO_DATE('15/03/2011', 'DD/MM/YYYY') AS dtedeb,TO_DATE('20/04/2012', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'fr' lib, 7 code,  TO_DATE('20/04/2012', 'DD/MM/YYYY') AS dtedeb,TO_DATE('31/05/2012', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'gb' lib, 8 code,  TO_DATE('02/02/2010', 'DD/MM/YYYY') AS dtedeb,TO_DATE('06/02/2010', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'gb' lib, 8 code,  TO_DATE('06/02/2010', 'DD/MM/YYYY') AS dtedeb,TO_DATE('15/03/2010', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'gb' lib, 8 code,  TO_DATE('15/03/2011', 'DD/MM/YYYY') AS dtedeb,TO_DATE('20/04/2012', 'DD/MM/YYYY') AS dtefin  FROM DUAL UNION ALL
    SELECT 'gb' lib, 8 code,  TO_DATE('20/04/2012', 'DD/MM/YYYY') AS dtedeb,TO_DATE('31/05/2012', 'DD/MM/YYYY') AS dtefin  FROM DUAL
    ), 
    t2 AS(SELECT code, lib, dtedeb, dtefin, 
    				CASE WHEN lag(code, 1)  OVER (PARTITION BY code, lib ORDER BY dtedeb) = code 
            AND lag(dtefin, 1) OVER (PARTITION BY code, lib ORDER BY dtedeb) <> dtedeb THEN 1 ELSE  0 END cont
    FROM t1),
    t3 AS (SELECT code, lib,  dtedeb, dtefin, SUM(cont) OVER (PARTITION BY code, lib ORDER BY dtedeb) grp
    FROM t2
    )
    SELECT code, lib, MIN(dtedeb) date_debut, MAX(dtefin) date_fin
    FROM t3
    GROUP BY code, lib, grp
    ORDER BY code, lib, date_debut
     
    Résultat
    CODE	LIB	DATE_DEBUT	DATE_FIN
    7	fr	02/02/2010	31/05/2012
    8	gb	02/02/2010	15/03/2010
    8	gb	15/03/2011	31/05/2012
    Est-ce que c'est ça que tu souhaites ?

    PS : Waldar.. rhooo.. même une première intervention se doit de bien lire le post d'origine

  17. #17
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    C'est exactement ça.
    Merci MCM
    Je suis désolé je ne maitrise pas Oracle et je ne sais pas comment fournir un jeu d'essai.
    En tout cas j'ai sous estimé et voila que ce n'etais pas aussi facile que ça.
    Merci à tous.
    :-)

  18. #18
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Seul bémol, comment elle est la requête?
    j'essaye de faire un select sur la dernière intervention de MCM mais je ne sais pas comment faire.
    Merci et encore dsl

  19. #19
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il faut comprendre les with AS comme des créations dynamiques de vues.
    Donc avec T1 ta table de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT code, lib, MIN(dtedeb) date_debut, MAX(dtefin) date_fin
    FROM (SELECT code, lib,  dtedeb, dtefin, SUM(cont) OVER (PARTITION BY code, lib ORDER BY dtedeb) grp
          FROM (SELECT code, lib, dtedeb, dtefin, 
                        CASE WHEN lag(code, 1)  OVER (PARTITION BY code, lib ORDER BY dtedeb) = code 
                        AND lag(dtefin, 1) OVER (PARTITION BY code, lib ORDER BY dtedeb) <> dtedeb THEN 1 ELSE  0 END cont
                FROM T1)
          )
    GROUP BY code, lib, grp
    ORDER BY code, lib, date_debut
    C'est peut-être optimisable comme SELECT.

  20. #20
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Merci bcp c'est resolu

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

Discussions similaires

  1. Extraction lignes de fichier
    Par frglyon dans le forum AIX
    Réponses: 2
    Dernier message: 11/01/2010, 17h20
  2. [HP-UX] - Extraction ligne fichier
    Par pimoos dans le forum Unix
    Réponses: 1
    Dernier message: 02/02/2009, 16h20
  3. OpenCV extraction ligne laser
    Par avironman dans le forum Général Python
    Réponses: 2
    Dernier message: 25/08/2008, 16h03
  4. sélection de lignes contigües de la ligne i à la ligne j
    Par pixine dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2008, 09h42
  5. Extraction ligne d'un fichier text
    Par bhahmed dans le forum C++Builder
    Réponses: 17
    Dernier message: 06/09/2006, 11h07

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