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 :

Récupérer n premières lignes dans un GROUP BY


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 254
    Par défaut Récupérer n premières lignes dans un GROUP BY
    Bonjour à tous,

    Voilà, j'ai un problème assez simple mais je ne trouve pas la solution même après avoir bien cherché sur le net.

    Je voudrais récupérer les n premières lignes d'un select, mais dans ce select il y a un group by, et je voudrais pouvoir récupérer les n premières non pas sur la requête en entière, mais au sein de chaque groupe.

    Ex : Imaginons que j'ai cette table à deux colonnes :

    CLIENT | COMMANDE
    Pierre | C001
    Pierre | C002
    Pierre | C003
    Paul | C004
    Paul | C005


    et que je veuille avoir les 2 premières commandes de chaque Client. Comment est ce que je pourrais faire ?

    si j'utilise la clause : "where rownum <= 2", il va me renvoyer que les deux premières lignes de toute la table (donc de Pierre), mais je voudrais voir aussi les résultats de Paul...


    Merci beaucoup pour votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Quelque chose dans ce goût-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with    ct1
        as  (   ma_requete_group_by
            )
        ,   ct2
        as  (   select  *
                    ,   row_number()  over  (   partition by    client
                                                order by        commande -- ?
                                            )   as  ligne
                from    ct1
            )
    select  *
    from    ct2
    where   ligne   <= :n
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Tu peux aussi inclure le row_number dans la requête du group by

    exemple

    Requête group by des objets de SYSTEM par type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT owner, object_type, COUNT(*) nb
    FROM dba_objects
    WHERE owner = 'SYSTEM'
    GROUP BY owner, object_type
    ORDER BY COUNT(*) desc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    OWNER	OBJECT_TYPE	NB
    SYSTEM	INDEX	154
    SYSTEM	TABLE	128
    SYSTEM	INDEX PARTITION	75
    SYSTEM	TABLE PARTITION	50
    SYSTEM	LOB	12
    SYSTEM	TYPE	10
    SYSTEM	VIEW	10
    SYSTEM	SYNONYM	8
    SYSTEM	SEQUENCE	7
    SYSTEM	FUNCTION	5

    Avec les 2 plus nombreux type de SYS et SYSTEM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM (
    SELECT owner, object_type, COUNT(*) nb, row_number() OVER(PARTITION BY owner ORDER BY COUNT(*) desc) numligne
    FROM dba_objects
    WHERE owner LIKE 'SYS%'
    GROUP BY owner, object_type
    )
    WHERE numligne <= 2
    ORDER BY owner, nb desc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OWNER	OBJECT_TYPE	NB	NUMLIGNE
    SYS	JAVA CLASS	34412	1
    SYS	VIEW	6407	2
    SYSTEM	INDEX	154	1
    SYSTEM	TABLE	128	2

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/06/2009, 19h34
  2. Récupération première ligne de chaque groupe
    Par iza76 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/01/2008, 10h07
  3. Réponses: 8
    Dernier message: 03/07/2007, 18h26
  4. Connaitre le nombre de ligne dans un groupe
    Par lilou77 dans le forum BIRT
    Réponses: 4
    Dernier message: 13/06/2007, 15h27
  5. Récupérer la première ligne d'un fichier
    Par nicolas66 dans le forum MATLAB
    Réponses: 3
    Dernier message: 14/02/2007, 23h08

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