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 :

Calcul d'un champ identifiant les sauts de valeurs


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut Calcul d'un champ identifiant les sauts de valeurs
    Bonjour,

    J'ai un petit problème d'algo :

    Je dispose d'une table de faits nommée FACT_AO,
    celle ci possède un identifiant ID_AO historisé.
    J'aimerais créer un champ de type flag 1 ou null identifiant les sauts de valeurs de mon ID_AO :

    ID_AO | FLG_NEW_ID_AO
    1 1
    2 1
    2 NULL
    2 NULL
    3 1

    J'ai pensé à un curseur parcourant la table entre les row n et n+1, mon problème c'est que je n'arrive pas à voir comment je vais pouvoir updater la bonne ligne.

    Any idea ?
    Cordialement.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Ce qui est indispensable, c'est d'identifier sur quel critère tu tries tes lignes.

    Rappel : une table n'est pas ordonnée par défaut.
    La même requête, si elle ne comporte pas de clause ORDER BY suffisante, peut retourner des lignes dans une ordre différent à chaque exécution.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Tout d'abord merci d'avoir lu mon méssage.

    Mes données sont triées par ID_AO ASC

    PS : j'ai déjà crée un RANK avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DENSE_RANK() over (order by ID_AO)
    Mon problème n'est pas en fait de savoir identifier les sauts de valeurs mais de pouvoir identifier la première ligne pour la flaguée à 1 puis les suivantes à NULL
    Cordialement.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    La colonne ID_AO n'est pas suffisante pour identifier de manière UNIQUE les lignes de ta table.
    Il faut donc que tu trouves, d'un point de vue fonctionnel, quelle(s) autre(s) colonne(s) prendre en compte pour d'une part garantir cette unicité, d'autre part ordonner les lignes.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Et c'est bien là mon problème, je ne possède pas de champs permettant d'identifier de façon certaine ma ligne . (ou tout du moins je n'en vois pas )

    C'est pour cela que j'essaie de creer un champ calculé type dense_rank.

    Pour un peu plus d’éclairci ma table de fait entrepose des Appels d'offres (AO).

    Autour gravite un dizaine de dimensions.

    Chaque appel d'offre porte des exigences ( compétences fonctionnelles , techniques , MOA ....)

    Si un AO demande 3 compétences techniques , alors 3 lignes seront insérée dans mes faits. Mais un autre AO peut exiger des compétence MOA .

    Peut être qu'un exemple concret sera plus parlant :

    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
    30
    31
    32
    33
    34
    35
     
    CREATE TABLE FACT_AO
    (	
      ID_AO           NUMBER       ,
    	REFERENCE_AO    VARCHAR2(50) ,
      RANK_AO         NUMBER ,
      ID_ETAT         NUMBER,
    	ID_CALENDAR_EMIS      NUMBER         , 
    	ID_CALENDAR_CLOT      NUMBER         , 
    	ID_RESPONSABLE  NUMBER, 
      ID_RESSOURCE    NUMBER,
      TYPE_RESSOURCE  NUMBER,
      FLG_SALARIE     NUMBER(1) DEFAULT 0,
      FLG_CANDIDAT    NUMBER(1) DEFAULT 0,
      ID_SOCIETE      NUMBER,
      ID_STATUT       NUMBER,
    	ID_COMP_FONC    NUMBER, 
    	ID_COMP_TECH    NUMBER, 
    	ID_FAM_MOA      NUMBER, 
    	ID_SFAM_MOA     NUMBER, 
    	ID_FAM_MOE      NUMBER, 
    	ID_SFAM_MOE     NUMBER, 
    	ID_ETUDE        NUMBER, 
    	ID_EXPERIENCE   NUMBER, 
    	ID_CLIENT       NUMBER, 
    	ID_LANGUE       NUMBER,
      DISTINCT_AO     NUMBER(1)
    );
     
    Insert into FACT_AO (ID_AO,REFERENCE_AO,RANK_AO,ID_ETAT,ID_CALENDAR_EMIS,ID_CALENDAR_CLOT,ID_RESPONSABLE,ID_RESSOURCE,TYPE_RESSOURCE,FLG_SALARIE,FLG_CANDIDAT,ID_SOCIETE,ID_STATUT,ID_COMP_FONC,ID_COMP_TECH,ID_FAM_MOA,ID_SFAM_MOA,ID_FAM_MOE,ID_SFAM_MOE,ID_ETUDE,ID_EXPERIENCE,ID_CLIENT,ID_LANGUE,DISTINCT_AO) values ('121','2010_MMA_1','32','2','3820','3825','1','0','0','0','0','0','99','3','2','0','0','0','0','5','7','116','0',null);
    Insert into FACT_AO (ID_AO,REFERENCE_AO,RANK_AO,ID_ETAT,ID_CALENDAR_EMIS,ID_CALENDAR_CLOT,ID_RESPONSABLE,ID_RESSOURCE,TYPE_RESSOURCE,FLG_SALARIE,FLG_CANDIDAT,ID_SOCIETE,ID_STATUT,ID_COMP_FONC,ID_COMP_TECH,ID_FAM_MOA,ID_SFAM_MOA,ID_FAM_MOE,ID_SFAM_MOE,ID_ETUDE,ID_EXPERIENCE,ID_CLIENT,ID_LANGUE,DISTINCT_AO) values ('121','2010_MMA_1','32','2','3820','3825','1','0','0','0','0','0','99','3','5','0','0','0','0','5','7','116','0',null);
    Insert into FACT_AO (ID_AO,REFERENCE_AO,RANK_AO,ID_ETAT,ID_CALENDAR_EMIS,ID_CALENDAR_CLOT,ID_RESPONSABLE,ID_RESSOURCE,TYPE_RESSOURCE,FLG_SALARIE,FLG_CANDIDAT,ID_SOCIETE,ID_STATUT,ID_COMP_FONC,ID_COMP_TECH,ID_FAM_MOA,ID_SFAM_MOA,ID_FAM_MOE,ID_SFAM_MOE,ID_ETUDE,ID_EXPERIENCE,ID_CLIENT,ID_LANGUE,DISTINCT_AO) values ('124','2010_CTO_25','35','2','3872','4008','62','0','0','0','0','0','99','4','0','0','0','0','0','4','10','104','0',null);
    Insert into FACT_AO (ID_AO,REFERENCE_AO,RANK_AO,ID_ETAT,ID_CALENDAR_EMIS,ID_CALENDAR_CLOT,ID_RESPONSABLE,ID_RESSOURCE,TYPE_RESSOURCE,FLG_SALARIE,FLG_CANDIDAT,ID_SOCIETE,ID_STATUT,ID_COMP_FONC,ID_COMP_TECH,ID_FAM_MOA,ID_SFAM_MOA,ID_FAM_MOE,ID_SFAM_MOE,ID_ETUDE,ID_EXPERIENCE,ID_CLIENT,ID_LANGUE,DISTINCT_AO) values ('124','2010_CTO_25','35','2','3872','4008','62','0','0','0','0','0','99','2','0','0','0','0','0','4','10','104','0',null);
    Insert into FACT_AO (ID_AO,REFERENCE_AO,RANK_AO,ID_ETAT,ID_CALENDAR_EMIS,ID_CALENDAR_CLOT,ID_RESPONSABLE,ID_RESSOURCE,TYPE_RESSOURCE,FLG_SALARIE,FLG_CANDIDAT,ID_SOCIETE,ID_STATUT,ID_COMP_FONC,ID_COMP_TECH,ID_FAM_MOA,ID_SFAM_MOA,ID_FAM_MOE,ID_SFAM_MOE,ID_ETUDE,ID_EXPERIENCE,ID_CLIENT,ID_LANGUE,DISTINCT_AO) values ('249','2011_PLA_6','99','2','4057','4158','40','0','0','0','0','0','99','0','0','42','0','0','0','5','7','281','0',null);
    Insert into FACT_AO (ID_AO,REFERENCE_AO,RANK_AO,ID_ETAT,ID_CALENDAR_EMIS,ID_CALENDAR_CLOT,ID_RESPONSABLE,ID_RESSOURCE,TYPE_RESSOURCE,FLG_SALARIE,FLG_CANDIDAT,ID_SOCIETE,ID_STATUT,ID_COMP_FONC,ID_COMP_TECH,ID_FAM_MOA,ID_SFAM_MOA,ID_FAM_MOE,ID_SFAM_MOE,ID_ETUDE,ID_EXPERIENCE,ID_CLIENT,ID_LANGUE,DISTINCT_AO) values ('249','2011_PLA_6','99','2','4057','4158','40','0','0','0','0','0','99','0','0','41','0','0','0','5','7','281','0',null);
    L'ID_AO 121 differe au niveau de ID_COMP_TECH
    Le 124 au niveau ID_COMP_FONC
    et le 249 au niveau de l'ID_FAM_MOA


    Mon but est d'updater mon champ DISTINCT_AO à 1 une seule fois par ID_AO et null pour le reste des lignes.
    Cordialement.

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Je n'ai pas tout compris. Pour l'id 121 quelle ligne doit être mise à jour et laquelle doit rester à null ?
    Sinon essayez d'identifier les lignes via leur rowid.

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Peut importe la ligne du moment qu'il n'y en a qu'une sur les 2 ( dans cet exemple mais de maniere plus générale sur les n)

    en gros

    ID_AO | distinct_AO
    121 | 1
    121 | null
    124 | 1
    124 | null
    249 | 1
    249 | null
    Cordialement.

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    OK j'ai peut etre un truc :

    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
    SELECT rowid,
      f.*
    FROM FACT_AO F
    WHERE F.ID_AO IN
      (SELECT T.ID_AO
      FROM FACT_AO T
      GROUP BY T.ID_AO,
        T.RANK_AO
      HAVING COUNT(*) > 1
      )
    --AND F.ID_AO IN (121,124,249)
    AND rowid    =
      (SELECT MAX(t.rowid) FROM FACT_AO t WHERE t.id_ao = f.id_ao
      )
    ORDER BY 2

    Merci à tous et à Marius de m'avoir murmurer rowid
    Cordialement.

  9. #9
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update FACT_AO t
      set t.distinct_ao = 1
    Where (id_ao, rowid) in (Select id_ao, max(rowid)
                               From FACT_AO
                              Group by id_ao
                            )

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    OK , problème résolu grâce à vous , merci

    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
    UPDATE FACT_AO FCT
    SET DISTINCT_AO = 1
    WHERE ROWID IN (
                    SELECT rowid
                    FROM FACT_AO F
                    WHERE F.ID_AO IN
                      (SELECT T.ID_AO
                      FROM FACT_AO T
                      GROUP BY T.ID_AO,
                        T.RANK_AO
                      HAVING COUNT(*) > 1
                      )
                    AND rowid    =
                      (SELECT MAX(T.ROWID) FROM FACT_AO T WHERE T.ID_AO = F.ID_AO  )
    );
    Cordialement.

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

Discussions similaires

  1. [XL-2003] champ calculé qui n'aime pas les multiplications
    Par Peanut dans le forum Excel
    Réponses: 2
    Dernier message: 26/11/2010, 12h29
  2. Identifier les champs autorisant la nullité
    Par reppier dans le forum SQL
    Réponses: 3
    Dernier message: 21/01/2009, 15h36
  3. Calculer la somme de tous les champs texte
    Par Maroxye dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/06/2008, 14h32
  4. Réponses: 4
    Dernier message: 07/05/2008, 10h53
  5. ETAT - Ignorer les sauts de ligne dans un champ mémo
    Par superseba888 dans le forum Access
    Réponses: 4
    Dernier message: 14/08/2006, 02h27

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