Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre régulier
    Inscrit en
    avril 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 56
    Points : 96
    Points
    96

    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 :
    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 Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 618
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    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 : 5 618
    Points : 12 716
    Points
    12 716

    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 831
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 831
    Points : 2 536
    Points
    2 536

    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 :
    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 Cédric Duprez
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 080
    Détails du profil
    Informations personnelles :
    Nom : Homme Cédric Duprez
    Âge : 39
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : avril 2002
    Messages : 5 080
    Points : 16 679
    Points
    16 679

    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 régulier
    Inscrit en
    avril 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 56
    Points : 96
    Points
    96

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •