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

Requêtes PostgreSQL Discussion :

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


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 56
    Points : 118
    Points
    118
    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
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 790
    Points
    30 790
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    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
    6 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 015
    Points : 23 704
    Points
    23 704
    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 : 118
    Points
    118
    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 Composants
    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