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 :

Identifier et numéroter des groupements


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Identifier et numéroter des groupements
    Bonjour,

    Je suis sur Oracle. Dans une table qui contient des données dont la cle est la date, je réussi à déterminer les brisures dans la séquence de dates de façon à identifier des périodes. Je n'arrive par contre pas à créer un champ qui contiennent un ID ou compteur pour les dates d'une période. Mon but ultime est d'afficher les débuts et fins de chaque période de dates successives. J'espère que c'est suffisament clair...voici un exemple de ce que je veux:

    Date PERIODE
    1-1-2007 1
    2-1-2007 1
    3-1-2007 1
    4-1-2007 1
    1-1-2008 2
    2-1-2008 2
    1-1-2009 3

    Merci de l'aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    Bonjour,
    d'après ce que j'ai compris de ta demande:
    1. est que le groupe sera le mois et l'année
    2. tes données peuvent changées ce qui nous oblige à rafraîchir la liste des périodes


    ce que j'ai fais est:
    1. création d'une table test qui contient mes données
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      create table test (Date1 date)
    2. création d'une vue qui contient l'ensemble des groupes de mes données
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      create or replace view test_view (grp_date) as 
      select distinct to_char(t.date1,'MMYY') from test t
    3. création d'une table temporaire qui contiendra mon résultat final
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      create table test_recap (date1 date, periode number)
    4. cette table sera rempli par la procédure suivante
      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
      Create Or Replace Procedure Test_Prc_Recap Is
        Cursor c Is
          Select * From Test_View Order By Grp_Date;
        Rec_c c%Rowtype;
        i     Number;
      Begin
        Delete Test_Recap;
        Open c;
        Loop
          Fetch c
            Into Rec_c;
          Exit When c%Notfound;
       
          i := c%Rowcount;
       
          Insert Into Test_Recap
            Select Date1, i From Test t Where To_Char(t.Date1, 'MMYY') = Rec_c.Grp_Date;
       
        End Loop;
       
        Close c;
       
        Commit;
      End;
      tu fais appelle à cette procédure à chaque raffraîchissement de données.



    R/ j'ai testé et c ok.

  3. #3
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Citation Envoyé par miro_mtl Voir le message
    Bonjour,

    Je suis sur Oracle. Dans une table qui contient des données dont la cle est la date, je réussi à déterminer les brisures dans la séquence de dates de façon à identifier des périodes. Je n'arrive par contre pas à créer un champ qui contiennent un ID ou compteur pour les dates d'une période. Mon but ultime est d'afficher les débuts et fins de chaque période de dates successives. J'espère que c'est suffisament clair...voici un exemple de ce que je veux:

    Date PERIODE
    1-1-2007 1
    2-1-2007 1
    3-1-2007 1
    4-1-2007 1
    1-1-2008 2
    2-1-2008 2
    1-1-2009 3

    Merci de l'aide.
    Bonjour,

    Je suppose que tu veux obtenir le max(id),date,periode par année .... c'est bien ca?

    Quelle est ta version Oracle ???

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Je suis sur Oracle 9i.

    Pour répondre à guizaniseifislam, non, le mois-année n'est pas la base des regroupements. Mon exemple est plutôt simple mais un regroupement de dates ininterrompues peut s'échelonner sur 2 années différentes, ou même plus.

    Ce que je veux obtenir ultimement est le début et la fin d'une séquence ininterrompue de dates. Dans mon exemple, je veux le début et la fin de la séquence que j'ai identifiée 1. Mon premier problème est avant tout de numéroter ces périodes.

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par miro_mtl Voir le message
    Je suis sur Oracle 9i.
    Dans mon exemple, je veux le début et la fin de la séquence que j'ai identifiée 1.
    Bonsoir,

    J'aurais proposé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FIRST_VALUE (DATE) OVER (PARTITION BY PERIOD) fv,
           LAST_VALUE (DATE) OVER (PARTITION BY PERIOD) lv
    mais, en lisant ceci
    Mon premier problème est avant tout de numéroter ces périodes
    le problème a l'air différent alors (?).

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  6. #6
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Voici une solution au problème en utilisant la fonction analytique 'lead' pour comarer la date avec la date suivante, 'add_months' pour comparer avec le mois suivant, et un 'connect by' pour faire le lien des dates qui se suivent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select "Date" date_deb,connect_by_root("Date") date_fin
    from (
            select
            "Date" ,
            case lead("Date") over (order by "Date") when add_months("Date",1) then add_months("Date",1) end suivant
            from t
    )
    where connect_by_isleaf=1
    connect by suivant = prior "Date" start with suivant is null
    Pour info, j'ai créé la table de test avec:

    create table t as
    select to_date('1-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('2-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('3-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('4-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('1-1-2008','mm-dd-yyyy') "Date" from dual
    union all select to_date('2-1-2008','mm-dd-yyyy') "Date" from dual
    union all select to_date('1-1-2009','mm-dd-yyyy') "Date" from dual


    et le résultat est:
    DATE_DEB DATE_FIN
    --------- ---------
    01-JAN-07 01-APR-07
    01-JAN-08 01-FEB-08
    01-JAN-09 01-JAN-09


    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci Franck,

    Ce serait parfait si j'étais sur 10G mais nous n'en sommes pas là encore, seulement sur 9i. Connect_by_isleaf n'est pas une pseudo-colonne reconnue en 9i. Une autre suggestion?

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    Dites moi SVP c koi ton critère de groupement des données

  9. #9
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Alors sans connect_by_isleaf, j'ai une solution en imbriquant un peu plus les requêtes (on prends le level du connect by, et on ne garde que le dernier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select date_deb,date_fin from (
      select date_deb,date_fin,row_level,max(row_level) over (partition by date_fin) leaf_level from (
        SELECT "Date" date_deb,connect_by_root("Date") date_fin,level row_level
        FROM (
                SELECT
                "Date" ,
                case lead("Date") over (ORDER BY "Date") when add_months("Date",1) then add_months("Date",1) end suivant
                FROM t
        )
        --WHERE connect_by_isleaf=1
        connect BY suivant = prior "Date" start WITH suivant IS NULL
      )  
    ) where row_level=leaf_level  
    /
    Il y a peut-être plus simple...

    Cordialement,
    Franck Pachot.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par guizaniseifislam Voir le message
    Dites moi SVP c koi ton critère de groupement des données
    Le seul critère est que ce soit des dates consécutives. Dès qu'il y a plus qu'un jour de différence avec la prochaine date, c'est un groupe différent!

    Merci.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,

    Alors sans connect_by_isleaf, j'ai une solution en imbriquant un peu plus les requêtes (on prends le level du connect by, et on ne garde que le dernier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select date_deb,date_fin from (
      select date_deb,date_fin,row_level,max(row_level) over (partition by date_fin) leaf_level from (
        SELECT "Date" date_deb,connect_by_root("Date") date_fin,level row_level
        FROM (
                SELECT
                "Date" ,
                case lead("Date") over (ORDER BY "Date") when add_months("Date",1) then add_months("Date",1) end suivant
                FROM t
        )
        --WHERE connect_by_isleaf=1
        connect BY suivant = prior "Date" start WITH suivant IS NULL
      )  
    ) where row_level=leaf_level  
    /
    Il y a peut-être plus simple...

    Cordialement,
    Franck Pachot.
    Malheureusement, connect_by_root n'existe pas non plus dans 9i...

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    bon ecoute,
    1. est ce que par 2-1-2007 tu désire le 2 janvier ou bien le premier fevrier
    2. donne moi un exemple qui contient plus de données du resultat attendu car je ne t'ai pas bien compris

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,

    Voici une solution au problème en utilisant la fonction analytique 'lead' pour comarer la date avec la date suivante, 'add_months' pour comparer avec le mois suivant, et un 'connect by' pour faire le lien des dates qui se suivent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select "Date" date_deb,connect_by_root("Date") date_fin
    from (
            select
            "Date" ,
            case lead("Date") over (order by "Date") when add_months("Date",1) then add_months("Date",1) end suivant
            from t
    )
    where connect_by_isleaf=1
    connect by suivant = prior "Date" start with suivant is null
    Pour info, j'ai créé la table de test avec:

    create table t as
    select to_date('1-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('2-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('3-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('4-1-2007','mm-dd-yyyy') "Date" from dual
    union all select to_date('1-1-2008','mm-dd-yyyy') "Date" from dual
    union all select to_date('2-1-2008','mm-dd-yyyy') "Date" from dual
    union all select to_date('1-1-2009','mm-dd-yyyy') "Date" from dual


    et le résultat est:
    DATE_DEB DATE_FIN
    --------- ---------
    01-JAN-07 01-APR-07
    01-JAN-08 01-FEB-08
    01-JAN-09 01-JAN-09


    Cordialement,
    Franck.
    g remarqué que t'as bien apprécié le résultat de cet exemple.
    si c bon, on peut l'avoir avec une simple requête sur la table test créé avec tes données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table test(date1) as
    select to_date('1-1-2007','mm-dd-yyyy')  from dual
    union all select to_date('2-1-2007','mm-dd-yyyy')  from dual
    union all select to_date('3-1-2007','mm-dd-yyyy')  from dual
    union all select to_date('4-1-2007','mm-dd-yyyy')  from dual
    union all select to_date('1-1-2008','mm-dd-yyyy')  from dual
    union all select to_date('2-1-2008','mm-dd-yyyy')  from dual
    union all select to_date('1-1-2009','mm-dd-yyyy')  from dual
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select min(date1),max(date1) from test
    group by to_char(date1,'yyyy')
    c bien ça ou non

  14. #14
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour guizaniseifislam,
    C'est effectivement le même résultat, mais seulement si chaque periode est sur une année différente (car group by année)...
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    g mal compris son besoin alors

    VEUILLEZ DONNER UN BON EXEMPLE DU RESULTAT ATTENDU

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre aide, j'apprécie beaucoup mais reprenons du début.

    "Mon but ultime est d'afficher les débuts et fins de chaque période de dates successives". Dans mon exemple, chaque période est dans une année différente mais la réalité pourrait être différente, je n'en sais rien mais je m'en balance. Donc peu importe l'année, j'ai besoin d'identifier les débuts et fins de chaque période de dates successives.

    Mon exemple initial est tout à fait adéquat en ce sens. La solution de Franck serait parafite si seulement j'étais sous 10G.

    Merci.

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    mais la réalité pourrait être différente
    mé tu pe pas nous fournir un bon exemple (pas l'autre car c pas toujour vrai)

Discussions similaires

  1. [XSLT] numérotation des lignes du tableau résultat
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 02/02/2006, 09h48
  2. Numérotation des entiers de NxN
    Par Celelibi dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 01/10/2005, 14h13
  3. [WORD] changer numérotation des pages
    Par meufeu dans le forum VBA Word
    Réponses: 3
    Dernier message: 20/07/2005, 17h13
  4. numérotation des lignes ...
    Par HellGee dans le forum MFC
    Réponses: 2
    Dernier message: 29/03/2005, 10h21
  5. [CR 8.5] Numérotation des pages et rappel dans sous état
    Par Nout dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 02/09/2004, 13h43

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