p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre habitué
    Inscrit en
    avril 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 56
    Points : 105
    Points
    105

    Par défaut Sélection de 3 lignes dans chaque groupe, vue ?

    Bonjour,

    J'ai un petit probleme. J'ai une table avec des articles et des categories.

    article_id, cat_id

    J'aimerais selectionner 3 articles par categories

    donc j'ai la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a1.*
    FROM article a1
    LEFT OUTER JOIN article a2
      ON (a1.cat_id = a2.cat_id AND a1.price < a2.price)
    GROUP BY a1.article_id
    HAVING COUNT(*) < 3;
    Le probleme c'est que la requete prend 4 secondes !

    Y'a moyen de fire mieux ? ou bien je devrais utiliser une vue issue de cette requete ?
    Une vue serais elle plus performante a la longue ?

    edit : bon ok, la vue est aussi lente ! Et pas moyen de faire de vue materialise sur postgresql 8.4 je crois ...

    Si vous avez une autre solution je suis preneur

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    6 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 6 086
    Points : 16 164
    Points
    16 164

    Par défaut

    Quelle version de PostgreSQL utilises-tu ?
    Quels sont les index présents sur ta table ?

    Est-ce bien SELECT a1.* .... GROUP BY a1.article_id que tu exécutes ?
    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
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 849
    Points : 2 815
    Points
    2 815

    Par défaut

    Si le regroupement se fait par cat_id et qu'il faut garder les 3 prix les plus faibles, il pourrait être plus efficace de passer par les fonctionnalités de fenêtrage.
    Le modèle de requête serait du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select colonnes from 
     (select colonnes,row_number() over (partition by cat_id order by price) as RN from article) AS s
     where s.RN<=3;
    Mettre aussi un index sur cat_id s'il n'y en a pas déjà.

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 398
    Points : 20 464
    Points
    20 464

    Par défaut

    Les fonctions de fenêtrages sont disponibles à partir de PostgreSQL 8.4.
    C'est effectivement le moyen le plus efficace pour traiter ce genre de question.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre habitué
    Inscrit en
    avril 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 56
    Points : 105
    Points
    105

    Par défaut

    J'utilise postgresql 8.4 ! Merci a tous !
    La soluton suivante fonctionne a merveille !

    Citation Envoyé par estofilo Voir le message
    Si le regroupement se fait par cat_id et qu'il faut garder les 3 prix les plus faibles, il pourrait être plus efficace de passer par les fonctionnalités de fenêtrage.
    Le modèle de requête serait du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select colonnes from 
     (select colonnes,row_number() over (partition by cat_id order by price) as RN from article) AS s
     where s.RN<=3;
    Mettre aussi un index sur cat_id s'il n'y en a pas déjà.

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

Discussions similaires

  1. Connaitre le nombre de ligne dans un groupe
    Par lilou77 dans le forum BIRT
    Réponses: 4
    Dernier message: 13/06/2007, 15h27
  2. Réponses: 1
    Dernier message: 08/12/2006, 16h00
  3. Sélection d'une ligne dans un JTable
    Par dam21 dans le forum Tables
    Réponses: 3
    Dernier message: 28/07/2004, 12h57
  4. Déplacer la sélection d'une ligne dans un stringgrid
    Par jer64 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/03/2003, 00h57

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