Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/07/2012, 22h30   #1
jv-boy
Membre régulier
 
Inscription : avril 2011
Messages : 50
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 50
Points : 85
Points : 85
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
jv-boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2012, 08h26   #2
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 933
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
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 : 4 933
Points : 11 926
Points : 11 926
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2012, 13h12   #3
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 707
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 707
Points : 2 353
Points : 2 353
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à.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2012, 09h46   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Gestion de bases de données techniques
Inscription : avril 2002
Messages : 4 179
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 37
Localisation : France, Loiret (Centre)

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

Informations forums :
Inscription : avril 2002
Messages : 4 179
Points : 10 449
Points : 10 449
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2012, 20h58   #5
jv-boy
Membre régulier
 
Inscription : avril 2011
Messages : 50
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 50
Points : 85
Points : 85
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à.
jv-boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web