Анализ данных PostgreSQL / Агрегаты - PullRequest
0 голосов
/ 01 июня 2009

У меня есть таблица в 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

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

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

У меня нет проблем с получением самого высокого «Ответа» для каждого «Вопроса», но также получение соответствующего «ответа» оказывается проблемой. SQL, который работает, чтобы получить вопрос и самый высокий ответ:

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

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

Я пробовал это:

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

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 01 июня 2009
SELECT
    DISTINCT ON (question)
    question, answer, responses
FROM
    mytable
ORDER BY
    question, responses DESC;
2 голосов
/ 01 июня 2009

Один из стандартных способов сделать это - использовать оконные функции. К сожалению это требует 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 голосов
/ 10 августа 2017
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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...