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

Langage SQL Discussion :

[DB2] Comment retrouver les bornes d'un intervalle


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [DB2] Comment retrouver les bornes d'un intervalle
    Bonjour,

    n'ayant pas trouvé de réponse à mon problème dans le forum, je me permet de le poser ici.

    Prenons les données suivantes :
    C1 C2 C3
    ---------
    01 12 A
    13 15 A
    16 20 A
    21 23 B
    24 25 B
    26 30 C
    31 32 A

    L'idée est de retrouver les bornes C1 et C2 correspondant à une même valeur de C3 en tenant compte de la continuité des valeurs de C3...

    Plus simplement, le resultat recherché est :
    C1 C2 C3
    --------
    01 20 A
    21 25 B
    26 30 C
    31 32 A

    Mon problème majeur est le respect de la continuité qui fait que deux lignes doivent apparaitre pour la valeur A de la colonne C de mon exemple.
    01 20 A
    31 32 A

    j'avoue plancher depuis plusieurs heures sans résultat probant. Quelqu'un aurait-il une idée de la requête SQL ?

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Citation Envoyé par martinm
    j'avoue plancher depuis plusieurs heures sans résultat probant. Quelqu'un aurait-il une idée de la requête SQL ?
    Peux-tu préciser STP ton SGBD ?

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Points : 4 657
    Points
    4 657
    Par défaut
    Bon déjà la notion de continuité dans un SGBD est une héresie. si je change le tri tu n'auras plus du tout le meme résultat.

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Xo
    Salut,

    Peux-tu préciser STP ton SGBD ?
    Bien sur, je suis sous DB2...

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Gaël Donat
    Bon déjà la notion de continuité dans un SGBD est une héresie. si je change le tri tu n'auras plus du tout le meme résultat.
    Dans mon cas, elle existe mais n'est pas systematique. Je ne l'ai pas précisé mais le cas suivant peut arriver :

    C1 C2 C3
    01 02 A
    05 08 A
    09 10 A
    11 12 B

    avec comme résultat :
    01 02 A
    05 10 A
    11 12 B

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Programmation oblige !
    AMHA, quel que soit le SGBD employé, je vois mal une requête SQL faire ce travail compte tenu qu'aucune colonne de l'exemple donné ne permet de distinguer la ligne 01 20 A de la ligne 31 32 A. Et quand bien même on réussirait à mettre plus ou moins au point une requête très compliquée, celle-ci s'avérerait si complexe qu'elle serait difficile voire impossible à maintenir.

    En revanche, faire ce travail dans un programme, ça serait du gâteau.

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par martinm
    je suis sous DB2...
    est-ce que tu peux utiliser des requêtes récussives or not sous DB2 ?
    En tout cas, je pense que le plus simple serait de développer ta fonction de "concaténation d'intervalles voisins" en langage procédural mais pas en SQL.

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Xo
    est-ce que tu peux utiliser des requêtes récussives or not sous DB2 ?
    En tout cas, je pense que le plus simple serait de développer ta fonction de "concaténation d'intervalles voisins" en langage procédural mais pas en SQL.
    Oui, les requêtes recursives existent sous DB2 et j'ai d'ailleurs essayé d'utiliser ce moyen (que je pense être le bon pour résoudre le problème) sans résultat. En revanche, mon expérience en ce domaine spécifique est assez limité et j'ai surtout réussi à faire chauffer le processeur de mon as/400 plus que de trouver le résultat adéquat.
    Avant de plus me documenter sur la recursivité, j'aurais aimé l'avis d'un expert pour éviter d'explorer un domaine dont je n'aurais pas l'immédiate utilité.

    L'usage d'une fonction spécifique est probablement la solution la plus facile. J'y aurais recours en cas d'échec à trouver la requête "qui va bien", la performance du SGBD étant bien supérieure au serveur qui devra traiter le résultat.

    Quoi qu'il en soit, je vous remercie pour vos réponses.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Puisque tu oeuvres sur AS400, plate-forme que je connais bien, tu peux tout à fait confortableemnt développer une procédure écrite dans un langage HLL tel que RPG ou Cobol, pour aboutir à ton résultat. Tu peux même si ça t'intéresse utiliser la langage procédural SPL (SQL Procedural Language) très facile à appréhender.

    Où comptes-tu placer le résultat ? Dans une autre table ? Le passer en paramètre ? Autre chose ?

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 401
    Points
    28 401
    Par défaut
    Si tu veux le faire en SQL, ça donnerait quelque chose comme ça :
    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
    select perdeb.ident
     , perdeb.debut
     , perfin.fin
    from
      ( select ident
        , debut
        , rank() over(partition by ident order by debut) as periode 
       from matable as periode
       where not exists ( select 1
             from matable as precedent
             where precedent.fin + 1 = periode.debut
              and precedent.ident = milieu.ident
            )
      ) as perdeb
     inner join
      ( select ident
        , fin
        , rank() over(partition by ident order by debut) as periode 
       from matable as periode
       where not exists ( select 1
             from matable as precedent
             where periode.fin + 1 = suivant.debut
              and precedent.ident = milieu.ident
            )
      ) as perfin
      on perdeb.ident = perfin.ident
      and perdeb.periode = perfin.periode
    ;
    A vérifier car je n'ai pas de SGBD sous la main pour le tester...

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Outch !
    C'est bien ce que je disais. Et même en supposant que ça marche comme ça sous i5, ce dont je doute fort même en l'aménageant, bonjour galère pour maintenir une requête de ce calibre !

  12. #12
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    al1_24 : Merci pour la requête (jolie bête). Dès que je peux la tester, je vous tiendrais au courant du résultat (pas avant lundi malheureusement).

    Le résultat de cette requête permettra l'établissement de statistiques et sera donc utilisée comme table temporaire d'une autre requête. Vu la complexité de la réponse proposée, je crains que l'ensemble ne soit un peu trop gourmand.
    J'ai pendant un instant rêvé à la solution miracle, la fonction ou "l'astuce" inconnue qui permettrait de résoudre le problème élégamment.
    La proposition de al1_24 ne fait que confirmer ce que je pensais. Ce genre de problème ne se traite pas facilement en SQL. Surtout en considérant que l'usage de sous-requête sous DB2 est rapidement catastrophique coté performance (du moins à ce que j'ai pu en voir).
    Dommage, dans mon cas, j'aurais pu en avoir un usage multiple.

    Reste donc le fameux language procédural que j'utilise peu. Ce sera l'occasion rêvée de s'y mettre. En espérant que mon chef me laisse l'opportunité de l'utiliser, ce dernier étant retissant à l'usage de techniques lui étant inconnues.

    Encore merci et bravo pour les réponses.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    C'est une bonne chose que tu prennes le chemin du langage procédural.

    Maintenant, si créer une fonction table (UDTF) en SPL, tu as toujours le recours de l'écrire en Cobol, RPG III ou IV (mieux) si tu te sens plus à l'aise avec ces langages plutôt qu'avec SPL. En outre ,tu peux aller voir sur mon site à l'adresse ci-dessous qq exemples de fonctions utilisateur écrites en RPG IV et SPL :
    http://www.psoriano.freesurf.fr/Formation/udf.htm

  14. #14
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour le lien, c'est en effet une très bonne base de départ.

    Je pense que l'on peut considérer le problème comme clos. Je completerais éventuellement la réponse en testant la requête SQL fourni par al1_24.

    Merci à tous.

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

Discussions similaires

  1. Comment retrouver les Dll ou les OCX suivantes?
    Par nnj dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/08/2007, 12h18
  2. Réponses: 3
    Dernier message: 26/02/2007, 10h14
  3. Between entre 2 dates : comment inclure les bornes
    Par vallica dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/06/2006, 14h37
  4. Comment retrouver les menus complets de Access ???
    Par sweety107 dans le forum Access
    Réponses: 3
    Dernier message: 20/12/2004, 11h33
  5. Comment retrouver les propriétés d'un fichier ?
    Par JuanLopez1966 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 01/09/2004, 16h34

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