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

DB2 Discussion :

Selection des n plus grands enregistrements


Sujet :

DB2

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut Selection des n plus grands enregistrements
    Bonjour,

    J'ai une table qui contient pour une même clé plusieurs occurence différenciées par un rang.

    Je souhaiterais savoir s'il est possible de selectionner pour chaque clé, les enregistrements ayant les "n" plus grandes occurences du rang.

    Merci pour votre aide
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Quel OS ? quelle Version ?

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    Oups, Désolé,

    Je suis en DB2 sous environnement Mainframe z/OS
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Pour simplifier la compréhension, j'aurai tendance à créer des vues.
    En partant sur la table RANGD ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CLE         RANG
    AAAAAAAAAA   10 
    AAAAAAAAAA   20 
    AAAAAAAAAA   30 
    AAAAAAAAAA   41 
    AAAAAAAAAA   51 
    AAAAAAAAAA   61 
    AAAAAAAAAA   74 
    BBBBBBBBBB    1 
    BBBBBBBBBB   20 
    BBBBBBBBBB   33 
    BBBBBBBBBB   47
    Je créerai une première vue pour reclasser les séquences de RANG au cas ou il y aurait des trous ou des séquences manquantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create view rang_V1 as (                     
    SELECT A.cle, A.rang, Count(*) AS Rank               
    FROM rangd A INNER JOIN rangd B ON A.cle = B.cle AND 
    A.rang >= B.rang                                     
    GROUP BY A.Cle, A.rang)
    Un Select * from RANG_V1 donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CLE         RANG           RANK 
    AAAAAAAAAA   10               1 
    AAAAAAAAAA   20               2 
    AAAAAAAAAA   30               3 
    AAAAAAAAAA   41               4 
    AAAAAAAAAA   51               5 
    AAAAAAAAAA   61               6 
    AAAAAAAAAA   74               7 
    BBBBBBBBBB    1               1 
    BBBBBBBBBB   20               2 
    BBBBBBBBBB   33               3 
    BBBBBBBBBB   47               4
    Puis je créérai une seconde vue contenant le max de chaque CLE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create view rang_V2 as (
    SELECT cle, max(Rank) maxi      
    FROM rang_V1                    
    GROUP BY Cle)
    Un Select * from RANG_V2 donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CLE                  MAXI 
    BBBBBBBBBB              4 
    AAAAAAAAAA              7
    Une troisème vue permettrait de renuméroter à l'envers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create view rang_V3 as (                     
    SELECT A.cle, A.rang, b.maxi + 1 - a.rank rank       
    FROM rang_v1 A INNER JOIN rang_V2 B ON A.cle = B.cle)
    Ainsi, si l'on recherche les 3 derniers :

    select * from rang_v3 where rank <= 3 order by cle, rank

    celà donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CLE         RANG           RANK 
    AAAAAAAAAA   74               1 
    AAAAAAAAAA   61               2 
    AAAAAAAAAA   51               3 
    BBBBBBBBBB   47               1 
    BBBBBBBBBB   33               2 
    BBBBBBBBBB   20               3

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    Merci pour cette réponse.

    Malheureusement, je ne vais pas pouvoir utiliser les vues. Le but (et j'ai également oublié de le préciser) C'est de constituer un fichier pour un traitement de batch.

    Cette requête sera donc réalisé dans un JCL ...
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Citation Envoyé par Antichoc Voir le message
    Merci pour cette réponse.

    Malheureusement, je ne vais pas pouvoir utiliser les vues. Le but (et j'ai également oublié de le préciser) C'est de constituer un fichier pour un traitement de batch.

    Cette requête sera donc réalisé dans un JCL ...
    Je ne comprends pas très bien !!!!
    Un create table monfic as (select * from rang_v3 where rank <= 3 order by cle, rank ) va te créer une table

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    C'est plutôt une contrainte technique et des normes de programmation qui m'en empêche ...

    Tampis, je vais devoir créer un batch pour faire ce dossier à l'aide d'un curseur, c'est probablement la meilleur solution !

    Merci pour ton aide !
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Si tu veux tout mettre dans une seule requête alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with t1 as (                                         
    SELECT A.cle, A.rang, Count(*) AS Rank               
    FROM rangd A INNER JOIN rangd B ON A.cle = B.cle AND 
    A.rang >= B.rang                                     
    GROUP BY A.Cle, A.rang),                             
         t2 as (                                         
    SELECT cle, max(Rank) maxi                           
    FROM T1                                              
    GROUP BY Cle)                                        
                                                         
    SELECT A.cle, A.rang, b.maxi + 1 - a.rank rank       
    FROM t1 A INNER JOIN t2 B ON A.cle = B.cle           
    where b.maxi + 1 - a.rank <= 3                       
    order by cle, rank

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    Effectivement, cette solution m'est autorisée !!

    Je n'y avais pas pensé. Je penses que cette requête va correspondre !

    Merci beaucoup pour ton aide

    @+
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  10. #10
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Je proposerai un truc plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with t1 as (                                         
    SELECT A.cle, A.rang, Count(*) AS Rank               
    FROM rangd  as a
    GROUP BY A.Cle, A.rang
    HAVING COUNT(*)>nn    -- <<< limite
    )                             
     
     
    SELECT A.*, b.*
    FROM t1 as a, rangd as b
    where a.cle = b.cle
    order by a.cle
    ;

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Bernard,

    Je ne crois pas que ta requête réponde aux attentes, regarde bien le résultat attendu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2007, 20h12
  2. [SQL SELECT] Chercher la plus grande valeur?
    Par zoltix dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/03/2007, 09h15
  3. Selections des tables ayant un enregistrement
    Par djspank dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/03/2007, 09h51
  4. selection par la plus grande date d'une année
    Par Chicna dans le forum Langage SQL
    Réponses: 8
    Dernier message: 21/02/2007, 13h47
  5. VBA_E : Selection des 5 plus grandes valeurs d'une colonne..
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/09/2006, 17h39

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