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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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