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 :

sql analytique , travailler sur des groupes de lignes.


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut sql analytique , travailler sur des groupes de lignes.
    Bonjour

    Je profite pas de la facilite de developpez.com mais vraiment je suis dans le flou meme pour la recherche sur google.
    Comme dans une discussion postée il ya quelques jours, j'ai une table comme suit

    ID Check

    0 1
    1 1
    2 0
    3 0
    4 1
    5 0
    6 0
    7 0
    8 1
    9 0
    10 0

    j'aimerai bien qu'une requete sql me sorte un resultat suivant

    ID_DEBUT ID_FIN
    2 3
    5 7

    Soit pour chaque intervalle de lignes ayant un check a 0 par id croissant , retrouvé le premier et le dernier id sans tenir compte des dernieres lignes ayant un check a 0.

    Merci d' avance

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select 
      min(id) id_debut,max(id) id_fin
    from
      (
      select id, 
        decode(c,
          0,decode(max(c) over (order by id desc),
            1,id-row_number() over (partition by c order by id))) x
      from t
      )
    where x is not null
    group by x
    order by 1

  3. #3
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    bonjour laurent

    Tout d abord un grand merci . Ca a fonctionne du premier coup.

    par contre avec la doc que j ai sous la main je narrive pas a comprendre la partie suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(max(c) over (ORDER BY id DESC), 1,id-row_number() over (partition BY c ORDER BY id))

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select id, 
          c,
          row_number() over (partition by c order by id) r, 
          max(c) over (order by id desc) m
      from t
      order by id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            ID          C          R          M
    ---------- ---------- ---------- ----------
             0          1          1          1
             1          1          2          1
             2          0          1          1
             3          0          2          1
             4          1          3          1
             5          0          3          1
             6          0          4          1
             7          0          5          1
             8          1          4          1
             9          0          6          0
            10          0          7          0
    le row_number numérote les lignes pour chaque c, lorsque deux lignes se suivent avec le même code, alors la différence entre le id et le rownumber par partition est constant.
    max donne la plus haute valeur de c pour la ligne courant et les suivantes (plus littéralement pour les lignes entre la prémière et la ligne courante trié par ID en ordre descendant)

    OK?

  5. #5
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    Oui merci , je ne comprenait pas la partie max(c) en fait . Mais avec ton exemple je comprend que c est l astuce pour ne pas recuperer les dernieres lignes a 0.

    J aurai une dernier question si a chaque ligne est associee une date , comment je peut recupere la min(date) et la max(date) pour chaque ligne dans la meme requete.

    Pour finir felicitations pour ton livre j ai impatience qu il soit disponible . J ai moi meme achete le "ORACLE TUNING definitive Guide" the D. Burleson et je trouve la qualite des ouvrages de Rampant de tres haut niveau

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    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 
      min(id) id_debut, min(d) keep (dense_rank first order by id) d_debut,
      max(id) id_fin, max(d) keep (dense_rank first order by id desc) d_fin
    FROM
      (
      SELECT id, d,
        decode(c,
          0,decode(max(c) over (ORDER BY id DESC),
            1,id-row_number() over (partition BY c ORDER BY id))) x
      FROM t
      )
    WHERE x IS NOT NULL
    GROUP BY x
    ORDER BY 1;
    note si les dates sont par ordre croissant (d[2]>d[1]) alors pas besoin de keep

  7. #7
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    Merci

    Je me suis lance dans l aventure avec succes maintenant, je voulais ajouter une collonne "CONTIENT UNE DATE A NULL", j y suis arriver avec la requete suivante

    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
     
    SELECT 
      min(id) id_debut, min(d) d_debut,
      max(id) id_fin, max(d)  d_fin,
      decode(min(d) keep (dense_rank first order by d nulls first),null,'OUI','NON' ) contient_null
    FROM
      (
      SELECT id, d,
        decode(c,
          0,decode(max(c) over (ORDER BY id DESC),
            1,id-row_number() over (partition BY c ORDER BY id))) x
      FROM t
      )
    WHERE x IS NOT NULL
    GROUP BY x
    ORDER BY 1;
    par contre ce qui m'etonne, c est que si je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(min(d) keep (dense_rank first order by d nulls first),null,'OUI','NON' )
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(first_value(d) over (order by d),null,'OUI','NON' )
    je recoit une erreur

    ORA-00979: not a GROUP BY expression

    Je pensait pourtant avoir compris le mecanisme.

    De plus lors de mes recherches pour cette requete , je suis tombé sur les clause MODEL et SPREADSHEET.

    Ces clauses pourrait elle me permettre d'afficher sous un contient_null = OUI la liste des id qui ont la date a null.

    Merci d'avance.

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 13h36
  2. Réponses: 5
    Dernier message: 13/07/2005, 10h03
  3. Travailler sur des sources distantes avec Eclipse
    Par El Saigneur dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 12/07/2004, 09h40
  4. Travailler sur des données qui doivent être triées
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 19/07/2003, 17h13
  5. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40

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