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
    Futur 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
    Points : 7
    Points
    7
    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 chevronné

    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
    Points : 1 775
    Points
    1 775
    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).
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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
    Points : 4 265
    Points
    4 265
    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

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Points : 46
    Points
    46
    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
    Points : 4 265
    Points
    4 265
    Par défaut
    Merci pour ta réponse.
    Dommage qu'il n'y ait pas un truc standard !

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 21
    Points : 20
    Points
    20
    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