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 :

Sous requête Oracle


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Par défaut Sous requête Oracle
    Bonjour,

    J'ai un requete à faire, mais je bloque... Je suis assez léger en sql.

    Donc, j'ai le tableau suivant:
    Pers couleur date_debut date_fin
    A bleu 18/11/2010 19/02/2011
    A vert 20/02/2011 05/05/2011
    A vert 06/05/2011 31/12/2099
    B vert 18/11/2010 05/02/2011
    B bleu 06/02/2011 09/04/2011
    B vert 10/04/2011 31/12/2099
    C vert 18/11/2010 25/03/2011
    C bleu 26/03/2011 31/12/2099

    Je ne dois garder que les occurrences pour chaque personne ayant pour derniere couleur vert (ici A et B).
    ET uniquement la ligne ayant la couleur verte et qui a été la première occurrence d'une suite de vert (ici la deuxième ligne de A et la dernière de B).

    Je n'arrive pas construire ma requête.

    Quelqu'un a une idée?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Que donne cette requête non testée ?
    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
      with t as (
    select pers, couleur, date_debut, date_fin,
           lag(couleur)  over (partition by pers order by date_debut) as prev_couleur,
           lead(couleur) over (partition by pers order by date_debut) as next_couleur,
           case when couleur <> nvl(lag(couleur)  over (partition by pers order by date_debut),'ZZZ')
                 and couleur =  nvl(lead(couleur) over (partition by pers order by date_debut),couleur)
                then 1
            end as debut_liste
      from latable
    )
    select pers, couleur, date_debut, date_fin
      from t
     where debut_liste = 1
       and couleur = 'vert'
       and pers in (select pers
                      from t
                     where couleur = 'vert'
                       and next_couleur is null)
    Ca ne tient pas compte d'un éventuel cas où il y aurait plusieurs liste de vert pour une personne.
    Si ce cas est envisageable il faudrait expliquer quelle liste doit être retenue.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Par défaut
    Bonjour,

    C'est vraiment excellent même si j'ai du mal à comprendre l'ensemble de la requête

    Merci pour ton aide.

    J'attends de voir si j'ai besoin d'un petit complément avant de mettre résolu.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Pour mieux comprendre la requête regarde LAG et LEAD
    Puis execute le WITH seul pour visualiser les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH t AS (
    SELECT pers, couleur, date_debut, date_fin,
           lag(couleur)  over (partition BY pers ORDER BY date_debut) AS prev_couleur,
           lead(couleur) over (partition BY pers ORDER BY date_debut) AS next_couleur,
           case when couleur <> nvl(lag(couleur)  over (partition BY pers ORDER BY date_debut),'ZZZ')
                 AND couleur =  nvl(lead(couleur) over (partition BY pers ORDER BY date_debut),couleur)
                then 1
            end AS debut_liste
      FROM latable
    )
    select * from
    Le reste n'est qu'un filtre assez simple.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Par défaut
    Bonjour,

    J'ai bien regardé, ce sont des fonctions analytiques. C'est vraiment performant!

    Pour répondre à la remarque de ton premier message, j'aimerais pouvoir indiquer que la suite qu'il faut utiliser est la dernière (celle où la dernière ligne de la suite a pour date de fin 31/12/2099).
    J'ai essayé le code ci-dessous mais cela ne marche pas (il ne me renvoie que les lignes dont la date de fin est le 31/12/2099):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT pers, couleur , DATE_DEBU, DATE_FIN
      FROM t
     WHERE debut_liste = 1
       AND couleur = 'vert'
       AND NUMR_PERS IN (SELECT NUMR_PERS
                      FROM t
                     WHERE couleur = 'vert'
                       AND next_couleur IS NULL
                       AND  DATE_FIN='31/12/2099')

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    En incrémentant debut_liste et en prenant la valeur max ça devrait fonctionner :
    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
      WITH t AS (
    SELECT pers, couleur, date_debut, date_fin,
           lag(couleur)  over (partition BY pers ORDER BY date_debut) AS prev_couleur,
           lead(couleur) over (partition BY pers ORDER BY date_debut) AS next_couleur,
           case when couleur <> nvl(lag(couleur)  over (partition BY pers ORDER BY date_debut),'ZZZ')
                 AND couleur =  nvl(lead(couleur) over (partition BY pers ORDER BY date_debut),couleur)
                then row_number() over (partition BY pers ORDER BY date_debut)
            end AS debut_liste
      FROM latable
    )
    SELECT pers, couleur, date_debut, date_fin
      FROM t
     WHERE debut_liste = (select max(t2.debut_liste) from t t2 where t2.pers = t.pers and t2.couleur = 'vert')
       AND couleur = 'vert'
       AND pers IN (SELECT pers
                      FROM t
                     WHERE couleur = 'vert'
                       AND next_couleur IS NULL)

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

Discussions similaires

  1. Sous requête Oracle
    Par barcelone94 dans le forum Débuter
    Réponses: 1
    Dernier message: 02/06/2014, 18h39
  2. [AC-2007] Requête SQL OK sous client Oracle, NOK sous Access
    Par Invité dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/06/2009, 17h09
  3. Réponses: 3
    Dernier message: 25/05/2009, 17h11
  4. ORACLE - Récupération champ sous requête
    Par bletz dans le forum SQL
    Réponses: 1
    Dernier message: 24/02/2009, 22h49
  5. [Oracle 10g] Problème Union-sous requêtes-group by
    Par slobberbone dans le forum SQL
    Réponses: 2
    Dernier message: 17/09/2007, 18h16

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