Вопрос

У меня есть таблица в 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-запрос для каждого вопроса, чтобы найти ответ, дающий наибольшее количество ответов?Я бы не хотел идти по этому запутанному пути, но я думаю, это вариант.

Спасибо!

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top