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 :

SELECT les 10 derniers pour plusieurs catégories


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut SELECT les 10 derniers pour plusieurs catégories
    Bonjour à tous,

    je me trouve confronté à une petite difficulté conceptuelle. J'ai une table qui contient 2 colonnes : un nom d'event et un timestamp.

    Mon but est de rapatrier les 10 derniers occurrences des différents types d'events.

    Est-il possible de faire cela en une requête ? Si oui comment ?

    D'avance, je vous remercie.

    Cordialement.

  2. #2
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Bonjour,

    la méthode est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
    from (
    select NOM_EVENT, EVENT_TIMESTAMP, rownum 
    from MA_TABLE
    order by EVENT_TIMESTAMP desc)
    where rownum <= 10;
    Explication : sous Oracle on ne peut pas faire directement un ROWNUM <= 10 (nombre de ligne retournées) car on doit d'abord trier les données par date décroissante.

    Décomposons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select NOM_EVENT, TIMESTAMP, rownum 
    from MA_TABLE
    order by TIMESTAMP desc
    Retour possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM_EVENT | TIMESTAMP | rownum 
    event1 | 10022009120336 | 35
    event6 | 11022009134525 | 2 
    event2 | 11032009134525 | 4
    Puis en faisant un select de cette requête et en ne prenant que les 10 premières lignes on obtient le résultat attendu.
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il serait de bon aloi d'aliaser le premier rownum !

  4. #4
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il serait de bon aloi d'aliaser le premier rownum !
    Ce n'est pas une obligation

    PS : requête testée
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Bonjour,

    merci pour vos réponses. Malheureusement le résultat souhaité n'est pas atteint. Mais ce n'est pas de votre faute. Mes explications n'étaient pas très claires.

    Je vais essayer d'être plus claire, en me référant à l'exemple donné par jsd03 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NOM_EVENT | TIMESTAMP | rownum 
    event1 | 10022009120336 | 35
    event6 | 11022009134525 | 2 
    event2 | 11032009134525 | 4
    Mon but est d'obtenir les 10 derniers events de chaque type et pas tout type confondu. C'est-à-dire qu'il me faudra les 10 dernières entrées de type 'event1', les 10 de type 'event2', ...

    Serais-je obligé de passer par du PL ?

  6. #6
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Effectivement je vois pas comment tu pourrais faire sans passer par du PL. Pour cela faire une boucle sur les events (distinct) puis adapter la requête comme ceci pour chaque event:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM (
    SELECT NOM_EVENT, EVENT_TIMESTAMP, rownum 
    FROM MA_TABLE
    where nom_event = 'monNomEventDeLaBoucleDistinct'
    ORDER BY EVENT_TIMESTAMP DESC)
    WHERE rownum <= 10;
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  7. #7
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par brolon Voir le message
    ...Mon but est d'obtenir les 10 derniers events de chaque type et pas tout type confondu. C'est-à-dire qu'il me faudra les 10 dernières entrées de type 'event1', les 10 de type 'event2', ...

    Serais-je obligé de passer par du PL ?
    Non, sans PL, c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NOM_EVENT,EVENT_TIMESTAMP
    FROM   (SELECT NOM_EVENT, 
                   EVENT_TIMESTAMP, 
                   ROW_NUMBER() OVER (PARTITION BY NOM_EVENT ORDER BY EVENT_TIMESTAMP DESC) RN
            FROM MA_TABLE)
    WHERE RN <= 10;
    Nicolas.

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Génial ça marche ! Merci NGasparotto.

    J'avais eu l'intuition de chercher dans la direction des partitions. Mais comme je n'ai jamais utilisé cela et que la journée était finie, j'ai préféré "être fainéant" et poser la question.

    Voila maintenant une bonne occasion de me documenter sur le sujet.

    Merci beaucoup à tous,

    Vincent.

  10. #10
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Citation Envoyé par brolon Voir le message
    ...
    Voila maintenant une bonne occasion de me documenter sur le sujet.
    Pareillement
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Hello

    je suis Okay avec cette requête, mais dans le cas où je dois filtrer la requête de plus bas niveau avec une clause se trouvant à un niveau au minimum +2, cela ne marche pas.

    Exemple : choisir les 10 derniers événements de statut 'X'

    SELECT * FROM TABLE_EVENEMENTS EVT
    WHERE EVT =
    ( SELECT *
    FROM (
    SELECT T.NOM_EVENT, T.EVENT_TIMESTAMP, rownum
    FROM MA_TABLE T
    WHERE T.nom_event = EVT.nom_event
    ORDER BY T.EVENT_TIMESTAMP DESC)
    WHERE rownum <= 10 );

    Le problème est que EVT.nom_event qui est une clause se trouvant dans la table de niveau +2 n'est pas accessible dans la requête de plus bas niveau.

    Avez-vous une solution ?

    Le but est bien de pouvoir filtrer la liste avec un certain nombre de clauses (ici, le TIMESTAMP décroissant) et en ne retenant que les 10 premiers résultats.

    merci
    lolo

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    http://oracle.developpez.com/faq/?page=3-1#rankrownum

    row_number() over (partition by nom_event ORDER BY EVENT_TIMESTAMP DESC)

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

Discussions similaires

  1. Récupérer les 10 derniers messages par catégorie
    Par mox20 dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/06/2013, 05h23
  2. Plusieurs catégories pour un même contact ?
    Par Mister Paul dans le forum Outlook
    Réponses: 5
    Dernier message: 30/04/2008, 10h57
  3. Réponses: 2
    Dernier message: 02/02/2008, 22h38
  4. [MySQL] Requête pour récupérer les 5 derniers enregistrement dans l'ordre croissant
    Par Jonathan.b dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/01/2008, 09h50

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