Анализ данных PostgreSQL/агрегаты
-
06-09-2019 - |
Вопрос
У меня есть таблица в 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
Примечание:исходный вопрос недостаточно конкретизирован, поскольку может быть более одного ответа с максимальным количеством ответов (на вопрос).