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 :

Retrouver une période


Sujet :

SQL Oracle

  1. #1
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut Retrouver une période
    Bonjour,
    j'ai des difficultés avec une requête. J'essaye de retrouver des débuts et fin de périodes dans la table suivante :
    "TBL_MESURE" avec la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Date          Mesure 
    01/01/2012	Bon
    12/01/2012	Bon
    13/01/2012	Moyen
    19/01/2012	Moyen
    21/01/2012	Bon
    10/02/2012	Moyen
    10/03/2012	Moyen
      3/04/2012	Bon
    En fait je cherche les périodes avec Mesure="Moyen", ce qui devrait me donner les périodes suivantes :
    - du 13/01/2012 au 19/01/2012
    - du 10/02/2012 au 10/03/2012

    J'ai penser à utiliser la fonction lag mais je n'y arrive pas... Auriez-vous une idée ?

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

    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
    Billets dans le blog
    4
    Par défaut
    Il me semble qu'il y a un algorithme pour gérer les plages mais je ne suis pas arrivé à retrouver dans le forum.
    Il doit y avoir un moyen plus simple, mais bon déjà celui ci marche


    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
    with t as (SELECT to_date('01/01/2012', 'DD/MM/YYYY') dte, 'Bon' mesure FROM DUAL
    union all SELECT to_date('12/01/2012', 'DD/MM/YYYY') dte, 'Bon' mesure FROM DUAL
    union all SELECT to_date('13/01/2012', 'DD/MM/YYYY') dte, 'Moyen' mesure FROM DUAL
    union all SELECT to_date('16/01/2012', 'DD/MM/YYYY') dte, 'Moyen' mesure FROM DUAL
    union all SELECT to_date('19/01/2012', 'DD/MM/YYYY') dte, 'Moyen' mesure FROM DUAL
    union all SELECT to_date('21/01/2012', 'DD/MM/YYYY') dte, 'Bon' mesure FROM DUAL
    union all SELECT to_date('10/02/2012', 'DD/MM/YYYY') dte, 'Moyen' mesure FROM DUAL
    union all SELECT to_date('10/03/2012', 'DD/MM/YYYY') dte, 'Moyen' mesure FROM DUAL
    union all SELECT to_date('03/04/2012', 'DD/MM/YYYY') dte, 'Bon' mesure FROM DUAL
    union all SELECT to_date('10/04/2012', 'DD/MM/YYYY') dte, 'Moyen' mesure FROM DUAL )
    select debut, fin
    from (
    select dte, pl, 
             case when pl IN ('Deb', 'DebFin') then dte end debut,
             case when pl = 'DebFin' then dte 
                 when pl ='Deb' AND lead(pl,1) over(order by dte) = 'Fin' then lead(dte) over (order by dte) end fin
    from (select dte, mesure, 
      case when mesure <> 'Moyen' THEN ''
           when NVL(lead(mesure, 1) over (order by dte), 'X') <> 'Moyen' AND NVL(lag(mesure, 1) over (order by dte), 'X') <> 'Moyen' THEN 'DebFin' 
           when NVL(lead(mesure, 1) over (order by dte), 'X') <> 'Moyen' THEN 'Fin'
           when NVL(lag(mesure, 1) over (order by dte), 'X') <> 'Moyen' THEN 'Deb' end pl
    from t)
    where pl is not null
    )
    where debut is not null
     
     
    DEBUT		FIN
    13/01/2012	19/01/2012
    10/02/2012	10/03/2012
    10/04/2012	10/04/2012

  3. #3
    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
    En effet c'est la méthode de Tabibitosan :
    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
    WITH t1 AS
    (
    SELECT to_date('01/01/2012', 'DD/MM/YYYY') as dte, 'Bon' as mesure FROM DUAL union ALL
    SELECT to_date('12/01/2012', 'DD/MM/YYYY')       , 'Bon'           FROM DUAL union ALL
    SELECT to_date('13/01/2012', 'DD/MM/YYYY')       , 'Moyen'         FROM DUAL union ALL
    SELECT to_date('16/01/2012', 'DD/MM/YYYY')       , 'Moyen'         FROM DUAL union ALL
    SELECT to_date('19/01/2012', 'DD/MM/YYYY')       , 'Moyen'         FROM DUAL union ALL
    SELECT to_date('21/01/2012', 'DD/MM/YYYY')       , 'Bon'           FROM DUAL union ALL
    SELECT to_date('10/02/2012', 'DD/MM/YYYY')       , 'Moyen'         FROM DUAL union ALL
    SELECT to_date('10/03/2012', 'DD/MM/YYYY')       , 'Moyen'         FROM DUAL union ALL
    SELECT to_date('03/04/2012', 'DD/MM/YYYY')       , 'Bon'           FROM DUAL union ALL
    SELECT to_date('10/04/2012', 'DD/MM/YYYY')       , 'Moyen'         FROM DUAL
    )
      ,  t2 as
    (
    select dte, mesure
         , row_number() over(                    order by dte asc)
         - row_number() over(partition by mesure order by dte asc) as grp
      from t1
    )
      select mesure
           , min(dte) as dte_debut
           , max(dte) as dte_fin
        from t2
    group by mesure, grp
    order by min(dte) asc;
     
    MESURE DTE_DEBUT  DTE_FIN  
    ------ ---------- ----------
    Bon    01/01/2012 12/01/2012 
    Moyen  13/01/2012 19/01/2012 
    Bon    21/01/2012 21/01/2012 
    Moyen  10/02/2012 10/03/2012 
    Bon    03/04/2012 03/04/2012 
    Moyen  10/04/2012 10/04/2012

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Merci Waldar, je savais que c'était un nom imprononçable
    Bon, du coup, je prends le code et je le garde au chaud, parce que j'ai pas réussi à le recoder.

  5. #5
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Merci à tous le code envoyé répond trés exactement à ma problématique (sans compter l'enrichissement culturel) merci ;-)

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

Discussions similaires

  1. Retrouver une donnée dans une zone de liste
    Par uloaccess dans le forum Access
    Réponses: 9
    Dernier message: 07/11/2005, 13h25
  2. Réponses: 4
    Dernier message: 28/10/2005, 13h32
  3. [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
  4. Réponses: 3
    Dernier message: 03/02/2004, 17h34

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