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 :

Requête sur des données "chainées"


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut Requête sur des données "chainées"
    Bonjour,

    j'ai une table INDISPO décrite ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Id
    IdApplication
    DateDebut
    DateFin
    avec par exemple les données suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Id   IdApplication    DateDebut   DateFin
    1          1            D1            D2
    2          1            D2            D3
    3          1            D3            D4
    ...
    10         1            D10           D11
    11         2            Dx            Dy
    12         1            Dx            Dy
    J'aimerais récupérer pour une application les différentes périodes d'indisponibilité.
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IdApplication    DateDebut     DateFin
           1            D1            D11
           1            Dx            Dy
    Je suis sous Oracle et je ne peux pas modifier la structure de ma base de données.

    Avez-vous une piste ?

    Merci d'avance
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    J'imagine que vous voulez faire de la séparation par intervalles de dates, les D1 à D11 se suivent, puis il y a un trou de données, puis Dx Dy se suivent ?

  3. #3
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Oui c'est cela. Je veux récupérer deux intervalles. Un qui va de D1 à D11 puisqu'il y a un chainage dans les dates, et un autre de Dx à Dy (sachant qu'il pourrait y avoir un chainage également que je n'ai pas indiqué)
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Voici une solution :
    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
    36
    37
    38
    39
    40
    With MaTable as
    (
    select 1 as id, 1 as ida, trunc(sysdate) as deb, trunc(sysdate) + 1 as fin from dual union all
    select 2      , 1       , trunc(sysdate) + 1   , trunc(sysdate) + 2        from dual union all
    select 3      , 1       , trunc(sysdate) + 2   , trunc(sysdate) + 3        from dual union all
    select 4      , 1       , trunc(sysdate) + 3   , trunc(sysdate) + 4        from dual union all
    select 5      , 1       , trunc(sysdate) + 4   , trunc(sysdate) + 5        from dual union all
    select 6      , 1       , trunc(sysdate) + 5   , trunc(sysdate) + 6        from dual union all
    select 7      , 1       , trunc(sysdate) + 6   , trunc(sysdate) + 7        from dual union all
    select 8      , 1       , trunc(sysdate) + 7   , trunc(sysdate) + 8        from dual union all
    select 9      , 1       , trunc(sysdate) + 8   , trunc(sysdate) + 9        from dual union all
    select 10     , 1       , trunc(sysdate) + 100 , trunc(sysdate) + 101      from dual union all
    select 11     , 1       , trunc(sysdate) + 101 , trunc(sysdate) + 102      from dual union all
    select 12     , 1       , trunc(sysdate) + 102 , trunc(sysdate) + 103      from dual
    )
      ,  sr1 as
    (
    select id, ida, deb, fin,
           case deb
             when lag(fin) over(partition by ida order by id asc)
             then null
             else id
           end as dlg
      from MaTable
    )
      ,  sr2 as
    (
    select id, ida, deb, fin,
           last_value(dlg ignore nulls) over(partition by ida order by id asc) as lvl
      from sr1
    )
      select ida, min(deb) as deb, max(fin) as fin
        from sr2
    group by ida, lvl
    order by ida asc, deb asc;
     
           IDA DEB        FIN       
    ---------- ---------- ----------
             1 16/03/2011 25/03/2011
             1 24/06/2011 27/06/2011

  5. #5
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Merci ça marche impeccable mais j'aurais jamais trouvé ça tout seul
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

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

Discussions similaires

  1. Requête sur des données en ligne
    Par Oncle_Pete dans le forum SQL
    Réponses: 6
    Dernier message: 27/03/2012, 16h50
  2. [JavaScript] Système de requêtes sur des données JSON
    Par kimjoa dans le forum Contribuez
    Réponses: 2
    Dernier message: 05/08/2010, 15h02
  3. Réponses: 5
    Dernier message: 25/09/2009, 18h44

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