2009-06-01 4 views
0

У меня есть таблица в PostgreSQL со следующей структурой & данных:PostgreSQL Анализ данных/Заполнители

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 

Как я могу выполнить запрос, который возвращает «ответ» с higest «Ответы» для каждого «Вопрос «? Для приведенных выше данных, я хотел бы увидеть что-то вроде:

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

У меня нет никаких проблем с получением в higest «Response» Еогеасп «вопрос», но и вынув соответствующий «ответ» на поверку быть проблемой. SQL, который работает, чтобы получить Вопрос & высокого отклика является:

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

Кто-нибудь может пролить свет на последнюю часть моего уравнения - показывать соответствующий ответ?

Я попытался это:

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

однако Postgres жалуется, что ответа не используется в совокупности или GROUP BY заявление. Должен ли я просто задать все мои вопросы заранее, а затем выполнить SQL-запрос для каждого вопроса, чтобы найти ответ с наибольшим количеством ответов? Я бы предпочел не пойти по этому грязному пути, но это вариант, я думаю.

Спасибо!

+0

Я должен уточнить, что я не всегда знаю, что находится в столбце «Вопрос» или «Ответы». Я просто хочу видеть * каждый вопрос с его наиболее популярным ответом. – rossp

ответ

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

Это трюк, спасибо! – rossp

2

Один стандартный способ сделать это - использовать функции окна. К сожалению, это требует 8.4, но если вы можете попробовать что-то, как это должно работать:

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 

Примечание: оригинальный вопрос находится под specificied, как там может быть больше, чем один ответ с максимальным числом ответы (на вопрос).

Смежные вопросы