2009-06-01 6 views
0

I mit folgenden Struktur & Daten eine Tabelle in PostgreSQL:PostgreSQL Datenanalyse/Aggregates

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 

Wie kann ich eine Abfrage, die die ‚Antwort‘ kommt mit dem higest ‚Antworten‘ für jede ‚Frage '? Für die oben genannten Daten würde ich so etwas sehen wollen:

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

Ich habe keine Probleme, die higest ‚Antwort‘ foreach ‚Frage‘ bekommen, sondern auch die entsprechende ‚Antwort‘ Herausziehen erweist sich ein Problem sein. Die SQL, die die Frage & höchste Antwort erhalten funktioniert, ist:

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

jemand irgendein Licht auf den letzten Teil meiner Gleichung vergießen kann - die entsprechende Antwort zeigt?

Ich habe dies versucht:

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

jedoch Postgres beklagt wird, dass Antwort nicht in einem Aggregat oder GROUP BY-Anweisung verwendet wird. Muss ich nur alle meine Fragen vorher bestimmen, dann eine SQL-Abfrage für jede Frage durchführen, um die Antwort mit den meisten Antworten zu finden? Ich würde lieber nicht diesen unordentlichen Weg gehen, aber es ist eine Option, denke ich.

Danke!

+0

Ich sollte klarstellen, dass ich nicht immer weiß, was in der Spalte "Frage" oder "Antworten" ist - ich will nur * jede * Frage mit seiner beliebtesten Antwort sehen. – rossp

Antwort

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

Dies hat den Trick, danke! – rossp

2

Eine Standardmethode hierfür sind Fensterfunktionen. Leider erfordert dies 8,4, aber wenn Sie versuchen, dass können, sollte in etwa so funktionieren:

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 

Hinweis: Die ursprüngliche Frage ist unter-specificied, da es mit der Höchstzahl mehr als eine Antwort von Antworten (pro Frage).