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 :

Dedoublonnage et période de données [10g]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut Dedoublonnage et période de données
    Bonjour,

    J'ai regardé sur le forum et je n'ai pas trouvé de réponse ... donc je suis preneur

    J'ai une table (nommons la "TABLE1" ) contenant :
    1. un identifiant NON unique (toutes les lignes avec le même identifiant correspondent à la même donnée à une période différente)
    2. un début de période
    3. une fin de période
    4. N champs de données.


    Petit exemple
    Identifiant debut fin champ 1 champ 2
    1 01/01/2012 31/12/2012 A A
    1 01/01/2013 30/06/2013 A B
    2 01/01/2012 30/06/2014 C D


    Quand on me demande les données à une date pour un identifiant, je vais regarder la ligne correspondant à mon identifiant et je vais chercher la ligne pour laquelle le debut de période est avant ma date et la fin de période est apres ma date.
    Ex : que vaut champ 1 , pour l'identifiant 1 au 30/09/2012? ==> réponse "A"

    Seulement voila : suite à des erreurs des utilisateurs, j'ai des milliers de "doublons" et je souhaiterais les supprimer...
    Techniquement les données ne sont pas doublons au sens propre car les périodes sont différentes mais je souhaiterais "simplifier les intervalles"
    en gros j'ai :
    Identifiant debut fin champ 1 champ 2
    1 01/01/2012 01/01/2012 A A
    1 02/01/2012 02/01/2012 A A
    1 03/01/2012 05/01/2012 A A
    1 06/01/2012 10/01/2012 A A
    1 11/01/2012 20/01/2012 B A
    Les 4 premieres lignes sont les mêmes et donc on pourrait remplacer tout ca par :
    Identifiant debut fin champ 1 champ 2
    1 01/01/2012 10/01/2012 A A
    1 11/01/2012 20/01/2012 B A


    je cherche donc un moyen :
    1. d'identifier les lignes qui ont les mêmes valeurs partout à l'exception des champs "début" et "fin"
    2. de supprimer ces doublons
    3. de créer une ligne identique aux lignes supprimées avec début = min des dates de début et fin = max date de fin



    le tout en prenant en compte qu'en plein milieu je peux avoir des lignes différentes.... (ce n'est pas parce que 2011 et 2014 sont identique que ma période doit aller de 2011 à 2014 , 2012 et 2013 peuvent être différents ....)

    Des pistes ? des idées ?( bon dans l'idéal un script tout fait mais bon, je saurais adapter et chercher)

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Cette requête devrait vous renvoyer le résultat voulu. Vous pouvez vous en servir pour mettre à jour votre table :

    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
     
     
    WITH CTE AS (
      SELECT 
        A.Identifiant 
        ,A.Debut
        ,A.Fin
        ,A.Champ1
        ,A.Champ2
     
        ,SUM(CASE WHEN B.Identifiant IS NULL THEN 1 ELSE 0 END) OVER(PARTITION BY A.Identifiant ORDER BY A.Debut) AS Rupt
      FROM T1 A
      LEFT OUTER JOIN T1 B
        ON B.Identifiant = A.Identifiant
        AND B.Champ1 = A.Champ1
        AND B.Champ2 = A.Champ2
        AND B.Fin = A.Debut - INTERVAL '1' DAY
    )
    SELECT 
      Identifiant
      ,Min(Debut)
      ,MAX(Fin)
      ,Champ1
      ,Champ2
    FROM CTE
    GROUP BY Identifiant, Champ1, Champ2, Rupt

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

Discussions similaires

  1. sélectionner des évènement que pendant une période temps donnée
    Par jenniferIUP dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/02/2009, 14h05
  2. [9][logiciel]Restriction des données selon une période
    Par hondavtec77 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 14/09/2007, 11h42
  3. comment faire l'export des données selon une période
    Par hadid dans le forum Administration
    Réponses: 9
    Dernier message: 28/08/2007, 11h30
  4. Réponses: 4
    Dernier message: 10/06/2006, 00h38
  5. [CR] Filtrer pour une période donnée
    Par liberio dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/04/2004, 16h32

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