2009-06-01 11 views
0

J'ai une table dans PostgreSQL avec la structure suivante & données:Analyse de données PostgreSQL/agrégats

Question  | Answer  | Responses 
--------------------------------------- 
Burger   BigMac  8 
Burger   Whopper  19 
Burger   Cheeseburger 4 
Drink   Coke   22 
Drink   Water   1 
Drink   Juice   7 
Side   Salad   8 
Side   Fries   19 

Comment puis-je exécuter une requête qui retourne la « réponse » avec « réponses » du higest pour chaque « Question '? Pour les données ci-dessus je veux voir quelque chose comme:

Question  | Answer  | Responses 
--------------------------------------- 
Burger   Whopper  19 
Drink   Coke   22 
Side   Fries   19 

Je n'ai pas de problème pour obtenir le higest « Response » foreach « Question », mais aussi en tirant le correspondant « réponse » se révèle être un problème. Le SQL qui fonctionne pour obtenir la réponse la plus élevée Question & est:

SELECT Question, MAX(Responses) FROM mytable GROUP BY Question; 

Quelqu'un peut-il faire la lumière sur la dernière partie de mon équation - montrant la réponse pertinente?

J'ai essayé:

SELECT Question, Answer, MAX(Responses) FROM mytable GROUP BY Question; 

cependant Postgres se plaint que réponse n'est pas utilisé dans un agrégat ou GROUP BY. Ai-je juste besoin de déterminer toutes mes questions à l'avance, puis faire une requête SQL pour chaque question pour trouver la réponse avec le plus de réponses? Je préfère ne pas descendre ce chemin désordonné, mais c'est une option je suppose.

Merci!

+0

Je devrais préciser que je ne sais pas toujours ce qui est dans la colonne «Question» ou «Réponses» - Je veux juste voir * chaque * question avec sa réponse la plus populaire. – rossp

Répondre

4
SELECT 
    DISTINCT ON (question) 
    question, answer, responses 
FROM 
    mytable 
ORDER BY 
    question, responses DESC; 
+0

Cela a fait l'affaire, merci! – rossp

2

Une façon standard de faire cela est d'utiliser les fonctions de fenêtre. Malheureusement, cela nécessite 8.4, mais si vous pouvez essayer, quelque chose comme cela devrait fonctionner:

SELECT question, answer, responses 
FROM (
    SELECT question,answer,responses,row_number() 
    OVER (PARTITION BY question ORDER BY responses DESC) 
    FROM mytable 
) AS t 
WHERE row_number=1 
0
Select Answer 
From mytable, (Select Question, max(Responses) as maxres 
       From mytable 
       Group by Questions) as Temp 
Where mytable.Question = Temp.Question 
     and mytable.Responses = Temp.maxres 

Note: la question initiale est sous-specificied comme il peut y avoir plus d'une réponse avec le nombre maximum de réponses (par question).