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 :

Trouver le rang


Sujet :

Langage SQL

  1. #1
    Mjm
    Mjm est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Points : 122
    Points
    122
    Par défaut Trouver le rang
    Bonjour,
    Un ami, pensant que j'avais quelques compétences en SQL , m'a soumis le pb suivant et je coince. (sans procédure stockée ni modification de la structure de table).
    Soit une table basique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NUMERO;NOM;PRENOM;etc
     
    1;DUPONT;MARIE;etc
    2;BERNARD;FARIDA;etc
    3;TRUCMUCHE;MARIE;etc
    etc;
    etc;
    (table de 50000 lignes ou plus);
    Question :
    Trouver la fréquence d'un prénom (ex: 'MARIE'), ça c'est facile COUNT(des 'MARIE') sur COUNT(total).
    Mais ou je coince c'est trouver le rang du prénom, cad MARIE est le Nième des prénoms dans la table.
    Une idée ?
    (De préférence en SQL standard, à défault en SQL Server ou FIREBIRD ou SQLITE)

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT PRENOM, RANK() OVER(ORDER BY Prenom) AS RANG
    À me lire : http://sqlpro.developpez.com/article...clause-window/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Mjm
    Mjm est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT PRENOM, RANK() OVER(ORDER BY Prenom) AS RANG
    À me lire : http://sqlpro.developpez.com/article...clause-window/

    A +
    Je suis pourtant un lecteur assidu , (site et livres) et je me suis sans doute mal exprimé sur ce que je veux (en fait ce n'est pas crucial mais ça m'agace ne de pas trouver )
    Le plus simple est de montrer un exemple toujours avec 'MARIE', sur la table exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select PRENOM, COUNT(PRENOM)
    from Fiches 
    WHERE SEXE='F' 
    GROUP BY PRENOM
    ORDER BY COUNT(PRENOM) desc
    J'obtiens une liste avec
    MARIE en 56 eme position et COUNT(PRENOM)=77, pour info le N°1 est EMMA
    donc j'aimerais que la requête retourne
    56, MARIE
    cad que MARIE est le 56 ème prénom féminin le plus donné dans cette table.

    Voilà, j'espère que c'est un peu plus clair.

    Merci
    Je répète cette requête n'est pas cruciale pour moi, c'est juste pour (essayer de) progresser un peu.

  4. #4
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Avez-vous regardé du côté de ROW_NUMBER() ?

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Normalement, cette requête devrait faire ton bonheur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT PRENOM, RANK() OVER(ORDER BY Nombre DESC) AS RANG
    FROM (
        select PRENOM, COUNT(PRENOM) Nombre
        from Fiches 
        WHERE SEXE='F' 
        GROUP BY PRENOM
    )
    Il suffit de mettre votre requête en sous-requête et de changer les colonnes sur lesquelles les comptages sont effectués.
    ~ Lola ~

  6. #6
    Mjm
    Mjm est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Points : 122
    Points
    122
    Par défaut
    Merci à tou(te)s, qui m'avez mis sur la voie
    le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT T.PRENOM, T.NOMBRE, T.CLASSEMENT
    FROM   (SELECT PRENOM, COUNT(PRENOM) AS NOMBRE, 
            RANK() OVER(ORDER BY COUNT(PRENOM) DESC) AS CLASSEMENT
            FROM   dbo.Fiches WHERE SEXE='F'
            GROUP  BY PRENOM) AS T
    WHERE  T.PRENOM = 'LOLA' ;)
    Fonctionne parfaitement et renvoie
    LOLA;178;5
    LOLA est le 5 éme prénom féminin le plus fréquent de la table.
    Merci cela m'a permis de travailler les fonctions OLAP (ou fonction fenêtrées), je mets donc [RESOLU], cependant comment faire sans RANK() OVER etc, comme dans FIREBIRD ou SQLITE ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Peut être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*)+1 FROM (
    SELECT COUNT(PRENOM) AS NOMBRE FROM dbo.Fiches GROUP BY (PRENOM)) AS T
    WHERE NOMBRE > (SELECT COUNT(PRENOM)  FROM dbo.Fiches WHERE PRENOM='LOLA')

  8. #8
    Mjm
    Mjm est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Peut être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*)+1 FROM (
    SELECT COUNT(PRENOM) AS NOMBRE FROM dbo.Fiches GROUP BY (PRENOM)) AS T
    WHERE NOMBRE > (SELECT COUNT(PRENOM)  FROM dbo.Fiches WHERE PRENOM='LOLA')
    Bravo ça fonctionne avec sqlite

    Merci et bonne soirée

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

Discussions similaires

  1. trouver le rang dans la VMT d'une méthode virtuelle
    Par acx01b dans le forum Langage
    Réponses: 20
    Dernier message: 13/10/2013, 04h49
  2. Réponses: 2
    Dernier message: 01/02/2013, 13h25
  3. trouver range à partir d'un critère dans colonne
    Par speedy_g dans le forum Excel
    Réponses: 5
    Dernier message: 05/05/2011, 08h42
  4. Trouver le rang d'un enregistrement avec Activerecord
    Par Zfred dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 19/11/2008, 14h32
  5. [VBA-W] Trouver le numero de Page d'une Selection (range)
    Par SfJ5Rpw8 dans le forum Contribuez
    Réponses: 2
    Dernier message: 08/09/2006, 19h34

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