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

SQL Oracle Discussion :

Requête qui affiche les top10


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Points : 80
    Points
    80
    Par défaut Requête qui affiche les top10
    Bonjour,
    j'ai une requête à effectuer pour ma formation, je la pensais juste mais visiblement elle ne l'est pas.

    Tout d'abord, je vous donne texto la requête, en anglais :

    1. The bosses at Agent_Ville would like to know who in recent years has been most active in doing research into our Information database.
    We’d like a list of the top 10 by volume. So that if two agents have accessed the same amount of data and they are in the top ten they should be displayed.

    Please could you order them by volume accessed (Greatest First) and then by surname(Alphabetically).
    Please name this table Research_topten.

    The Columns used should be, full_name and Data_Volume_Accessed. And the starting year for this is 2004.
    Voilà comment je comprends la question :

    Nous devons réaliser une requête qui permettra de connaître les 10 agents qui ont accéder au plus d'informations dans notre base de donnée.
    Nous devons comptabiliser uniquement les recherches effectués après 2003.
    Nous devons prendre en compte les égalités, par exemple si un agent 8 agents ont accédé à 7 information et que ce total figure dans le top 10 ces 8 agents doivent être affiché.

    Ensuite on nous demande simplement d'ordonné les résultats ...


    Pour ce faire, j'ai 3 tables qui vont (ou pas) servir :
    Une table information, qui répertorie les informations entré dans la base de donnée par les agents secret (glups)
    Une table agent, qui identifie les agents
    une table info_access qui montre les informations accédées, par quel agent et quand.

    Voici ma 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    drop view  
                result_research_topten;
    create view 
                result_research_topten
    as
    select 
                                "full name", 
                                data_volume_accessed
                        from (
                                      select 
                                            ia.agent_id, 
                                            a.last_name || ' ' || a.first_name "full name", 
                                            count(*) data_volume_accessed
                                      From 
                                            info_access ia 
                                            inner join 
                                            agents a 
                                            on  a.agent_id=ia.agent_id
                                      where to_char(logon_time,'yyyy')>2003
                                      group by 
                                              ia.agent_id, 
                                              a.last_name || ' ' || a.first_name
                                     order by 
                                              count(*) desc, 
                                              a.last_name || ' ' || a.first_name
     
                              )
                        where data_volume_accessed  in            (
                                                        select data_volume_accessed
                                                        from (
                                                                    select data_volume_accessed
                                                                    from (
                                                                            select 
                                                                                  agent_id,
                                                                                  count(agent_id) data_volume_accessed
                                                                            from info_access
                                                                            where to_char(logon_time,'yyyy')>2003
                                                                            group by agent_id
                                                                            )
                                                                   group by data_volume_accessed
                                                                   order by data_volume_accessed desc
                                                              )
                                                        where rownum<11
                                                        );
    drop table 
                research_topten;
    create table 
                research_topten
    as
    select * 
    from result_research_topten
    order by 
              data_volume_accessed desc, 
              "full name"
    ;
    drop view 
              result_research_topten
    ;
    Voila, visiblement la requête est fausse, on me demande de bien relire la question ...

    I need some help ...

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Donne le desc des tables.
    Pour un top 10 des volumes, prendre un count(*) ne me semble pas indiqué...


    Voici un code (non testé) avec une fonction analytique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT agent_id, full_name, data_volume_accessed
    FROM(
    	SELECT agent_id, full_name, data_volume_accessed, DENSE_RANK() OVER(ORDER BY data_volume_accessed DESC) DENSE_RNK
    	FROM
    		(
    		SELECT ia.agent_id, a.last_name ||' '|| a.first_name AS full_name, COUNT(*) data_volume_accessed
    		FROM INFO_ACCESS ia, AGENTS a  
    		WHERE a.agent_id = ia.agent_id
    		AND logon_time >= TO_DATE('01/01/2004', 'DD/MM/RRRR')
    		GROUP BY ia.agent_id, a.last_name || ' ' || a.first_name
    		ORDER BY 3 DESC, 2
    		)
    	)
    WHERE dense_rnk <= 10

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Points : 80
    Points
    80
    Par défaut
    On obtient le même résultat avec ta requête qu'avec la mienne.

    Mais je ne connaissais pas du tout dense_rnk, qui permettrait d'alléger considérablement ma requête.

    C'est un bon début.

    Maintenant, étant donné qu'on a la même réponse (j'ai testé ta requête sur ma base de données)

    Soit il y a un point dans la question qui nous échappe, soit ma formation m'a posé cette question pour que je trouve par moi même la fonction dense_rnk ...

    Voici le descriptif des tables :

    agents :
    AGENT_ID
    FIRST_NAME
    LAST_NAME
    CODE_NAME
    SECURITY_LEVEL
    BIRTH_DATE
    ACTIVATION_DATE
    DEACTIVATION_DATE
    LOCATION_ID

    info_access :

    AGENT_ID
    LOGON_TIME
    INFORMATION_ID
    LOGOFF_TIME

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Juste pour que tu n'apprennes pas un truc faux :
    dense_rnk est l'alias qu'à donné McM.

    La fonction utilisée est dense_rank().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DENSE_RANK() OVER(ORDER BY data_volume_accessed DESC) DENSE_RNK
    Documente toi sur les fonctions analytiques, car c'est vraiment du bonheur

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je pense que dans la table information, il doit y avoir le nb de bytes du texte.
    Tu n'as pas donné le desc de cette table.

    C'est, je pense ce volume de données que ta formation te demande de calculer, pas le nb d'accès.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/10/2014, 16h18
  2. [AC-2010] Problème requête qui affiche toujours les lignes supprimées d'une tables
    Par Bou31 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/07/2013, 18h15
  3. Requête qui affiche les enregistrements de la semaine en cours
    Par fanico11 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 28/04/2008, 17h55
  4. Requête qui affiche les rdv DU JOUR
    Par fanico11 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 24/04/2008, 17h22
  5. Requête qui renvoie les valeurs les plus souvent affichés
    Par athos7776 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 25/07/2007, 18h54

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