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

PostgreSQL Discussion :

Requête SQL pour afficher un nuage de mots [9.1]


Sujet :

PostgreSQL

  1. #1
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut Requête SQL pour afficher un nuage de mots
    Bonjour ,

    Je dispose d'une table dont j'ai simplifié volontairement la structure pour ce post. Cette table représente les mots saisis par un utilisateur dans une fenêtre de saisie ( l'utilisateur ne saisit qu'un mot , par exemple : cuivre )

    Cette table a une seule colonne qui contient un mot (exemple : cuivre )
    Plusieurs lignes de cette table peuvent contenir le même mot (cf dump en pièce jointe)

    Avec un group by , je peux afficher le nombre d’occurrences de chaque mot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT keywords , count(*)
    FROM matable
    group by keywords ;
    Résultat :
    plomb;1
    chrome;4
    carbone;5
    cuivre;2
    aluminium;4


    Ce que je cherche à faire : transposer ce nombre d’occurrences en taille de police , suivant les 3 paramètres suivants :
    -- paramètre 1 : taille mini police . exemple : 8
    -- paramètre 2 : taille maxi police . exemple : 24
    -- paramètre 3 : le "pas" entre 2 tailles de police. exemple 2
    Bien sûr comme je reste en SQL , ces paramètres seront fixes. 8,24,2 par exemple.

    Affichage :
    mot le moins populaire : plomb --> 1 --> taille police 8
    mot le plus populaire : carbone --> 5 --> taille police 24
    et pour les autres mots la valeur sera parmi ces valeurs : tailles 10 , 12 , 14 , 16 , 18 , 20 , 22 ( car j'ai choisi un pas de 2 )

    Comme cela me semble ardu je fais appel aux cerveaux de ce site ( moi démago ? jamais ! )
    Je ne sais pas si c'est faisable ( avec with sur la 1ère requête , + fenêtrages ? )

    Merci d'avance !
    Fichiers attachés Fichiers attachés

  2. #2
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut Solution
    Finalement nous ignorons la notion de "pas".

    Voici la requête :
    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
    WITH 
     
    v1 as
    (
    SELECT keywords , count(*) as o
    FROM matable
    group by keywords )
    , 
     
    v2 as
    (SELECT count(*) as min_o
    FROM matable
    group by keywords
    ORDER BY count(*)  
    LIMIT 1
    ),
     
    v3 as
    (SELECT count(*) as max_o
    FROM matable
    group by keywords
    ORDER BY count(*) DESC 
    LIMIT 1
    )
     
    SELECT keywords , o , round ( (  ( 24 * ( min_o - o ) ) + ( 8 * (o- max_o))  ) / ( min_o - max_o ) , 0) as taille_police
    FROM v1 , v2 , v3
    ORDER BY o

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez aussi essayer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT keywords ,
    	CUME_DIST() OVER(ORDER BY COUNT(*)) * (24 - 8) + 8
    FROM matable
    group by keywords ;

  4. #4
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut
    Merci pour cette proposition mais on n'a pas 8 pour la plus petite popularité.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Je dirai qu'il suffit de tronquer le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT keywords ,
    	FLOOR(CUME_DIST() OVER(ORDER BY COUNT(*)) * (24 - 8) + 8)
    FROM matable
    group by keywords ;

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Les données de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE matable (mot varchar(32), nbr int)
    INSERt INTO matable VALUES
    ('plomb', 1),
    ('chrome', 4),
    ('carbone', 5),
    ('cuivre', 2),
    ('aluminium', 4);
    La requête finale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH T1 AS
    (
    SELECT *, (RANK() OVER(ORDER BY nbr) - 1) / (COUNT(*) OVER() * 1.0) AS INDICE
    FROM matable
    ),
    T2 AS
    (
    SELECT 1 / MAX(INDICE) AS SPREAD
    FROM   T1 
    )
    SELECT mot, nbr, (INDICE * SPREAD * (24-10) + 10) - (INDICE * SPREAD * (24-10) + 10) % 2 
    FROM   T2 CROSS JOIN T1
    Vous vous en sortirez mieux avec un PERCENT_RANK() à la place de (RANK() OVER(ORDER BY nbr) - 1) / (COUNT(*) OVER() * 1.0)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mot             nbr         
    --------------- ----------- ------------
    plomb           1           10.000000
    cuivre          2           12.000000
    aluminium       4           16.000000
    chrome          4           16.000000
    carbone         5           24.000000

    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/ * * * * *

  7. #7
    Membre actif
    Profil pro
    Gestionnaire de données
    Inscrit en
    Mars 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestionnaire de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 356
    Points : 248
    Points
    248
    Par défaut Merci !
    Merci à tous !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2013, 19h27
  2. requête SQL pour afficher plusieurs BD
    Par rourou25 dans le forum SQL
    Réponses: 0
    Dernier message: 28/04/2010, 19h08
  3. [MySQL] Requête SQL pour afficher des "Related Items"
    Par neoweiter dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/07/2009, 14h15
  4. Requête sql pour afficher une somme
    Par nora2311 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/06/2009, 16h47
  5. Requête SQL pour afficher un tri
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2005, 15h27

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