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 :

[FAQ] Emuler la fonction RANK() d'Oracle.


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Par défaut [FAQ] Emuler la fonction RANK() d'Oracle.
    Bonjour,

    Je cherche à émuler en SQL standard la fonction RANK() de Oracle : cette fonction permet d'afficher le rang de tuples retournés par une requête et ordonnés selon un ORDER BY.

    Ex: SELECT nom, age, RANK(OVER ORDER BY age) AS rang FROM personnes;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nom       age rang
    ------------------
    pierre    45  1
    jean      44  2
    paul      37  3
    christian 37  3
    alexandre 35  5
    L'idée serait la suivante : pour chaque tuple t résultat, on compte combien de tuples ont pour valeur d'attribut de tri, une valeur strictement supérieure à celle de t, on ajoute 1 pour obtenir le rang.
    Ex: pour Paul, il y a 2 tuples dont l'attribut age est > à celui du tuple Paul, donc le rang de Paul est 2 + 1 = 3.

    Je n'arrive pas à écrire cette requête en SQL standard...

    Pourriez-vous m'aider ?

    Merci,

    Alexandre

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    8i CYRIL> select *
      2  from t09;
     
    NOM                         AGE
    -------------------- ----------
    pierre                       45
    jean                         44
    paul                         37
    christian                    37
    alexandre                    35
     
    5 ligne(s) sélectionnée(s).
     
    8i CYRIL> ed
    A écrit fichier  afiedt.buf
     
    ligne 5 tronquée.
      1  select nom, age, (select count(*) + 1
      2                    from t09 B
      3               where A.age < B.age ) rang
      4* from t09 A
      5  /
     
    NOM                         AGE       RANG
    -------------------- ---------- ----------
    pierre                       45          1
    jean                         44          2
    paul                         37          3
    christian                    37          3
    alexandre                    35          5
     
    5 ligne(s) sélectionnée(s).

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par Magnus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select nom, age, (select count(*) + 1
                        from t09 B
                   where A.age < B.age ) rang
      from t09 A;
    une fonction "RANG", ça serait pas mal dans le sujet FAQ ça
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    C'est super lorsqu'on a un champs sur lequel s'opère le tri :
    - l'age dans ce post
    - ou la note des élèves dans un autre post

    Mais comment numéroter des lignes sans de tels critères ?
    Moi, j'ai une requête toute bête qui peut me retourner plusieurs lignes et je voudrai qu'elle soit numérotées.

    Edit :

    Finalement, j'ai pris l'identifiant comme critère

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Citation Envoyé par benwit
    C'est super lorsqu'on a un champs sur lequel s'opère le tri :
    - l'age dans ce post
    - ou la note des élèves dans un autre post

    Mais comment numéroter des lignes sans de tels critères ?
    Moi, j'ai une requête toute bête qui peut me retourner plusieurs lignes et je voudrai qu'elle soit numérotées.

    Edit :

    Finalement, j'ai pris l'identifiant comme critère
    Pour Oracle, il existe la fonction rownum. Elle permet de te retourner le numéro de ligne... L'ordre dans ce cas de figure est géré par Oracle quelque chose comme Premier inséré, premier affiché. Mais il faut vérifier je ne suis pas sûr !

    Voila

  6. #6
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Merci pour ta réponse.
    Dommage qu'il n'y ait pas un truc standard !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 21
    Par défaut
    Bonjour,

    En reprenant l'exemple ci-dessous, comment faire dans Oracle pour filtrer sur un Rang, par exemple, je ne veux afficher au résultat ci-dessous que les rang=1 ?

    Merci



    Dav

    Citation Envoyé par djeen Voir le message
    Bonjour,

    Ex: SELECT nom, age, RANK(OVER ORDER BY age) AS rang FROM personnes;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nom       age rang
    ------------------
    pierre    45  1
    jean      44  2
    paul      37  3
    christian 37  3
    alexandre 35  5

    Alexandre

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

Discussions similaires

  1. Fonction IIF sous Oracle
    Par noirot dans le forum Oracle
    Réponses: 8
    Dernier message: 27/04/2009, 17h13
  2. equivalent de la fonction minus d'oracle
    Par sapic dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2006, 13h34
  3. [Access] equivalent de la fonction minus d'oracle
    Par sapic dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/09/2006, 12h12
  4. Fonction Date in Oracle ?
    Par madina dans le forum Oracle
    Réponses: 1
    Dernier message: 21/06/2006, 19h50
  5. Equivalent de la fonction NVL sous oracle en SQL-server
    Par MorbidAngel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/09/2005, 10h50

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