Дополнительно
должны появляться в группе by или использоваться в агрегатной функции
У меня есть таблица, которая выглядит следующим абонента 'makerar'
cname | wmname | avg
--------+-------------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 1.00000000000000000000
spain | usopp | 5.0000000000000000
И я хочу выбрать максимальное AVG для каждого типа CNAME.
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
но я получаю сообщение об ошибке,
ERROR: column "makerar.wmname" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
так что я делаю это
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
однако это не даст предполагало результаты, и неверный результат ниже показано.
cname | wmname | max
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | luffy | 1.00000000000000000000
spain | usopp | 5.0000000000000000
Фактические результаты должны быть
cname | wmname | max
--------+--------+------------------------
canada | zoro | 2.0000000000000000
spain | usopp | 5.0000000000000000
Как я могу идти о фиксации этой проблемы?
Примечание: эта таблица-это представление, созданное из предыдущей операции.
239
7
Да, это общая проблема агрегирования. Перед [SQL3 (1999)][1], некоторые поля должны отображаться в
группе
п.[*].Чтобы обойти эту проблему, необходимо рассчитать совокупные в суб-запроса и затем присоединить его с собой, чтобы сделать дополнительные столбцы, вы'd нужен, чтобы показать:
Но вы также можете использовать оконные функции, который выглядит проще:
Единственная вещь, с помощью этого метода заключается в том, что он будет показывать все записи (окно функции не группа). Но он будет показывать правильно (т. е. с превышением нормы в
имя
уровень)Макс
для страны в каждом ряду, так что's до вас:Решение, вероятно, менее элегантный, чтобы показать только(запись CNAME, wmname)` кортежей, соответствующих максимальному значению, является:
[1]: http://web.cecs.pdx.edu/~лен/sql1999.формат PDF
[*]: Достаточно интересно, хотя в спецификации вроде как позволяет выбрать не-сгруппированных полей, крупных двигателей, похоже, не очень нравится. Oracle и SQLServer просто Дон'т допустить этого вообще. В MySQL используется, чтобы разрешить его по умолчанию, но теперь с 5.7 нужд администратора, чтобы включить этот параметр (
ONLY_FULL_GROUP_BY
) вручную в конфигурации сервера для этой функции...В Postgres, вы также можете использовать специальные
четкая на (выражение)
синтаксис:Проблема с указанием номера группируются и неагрегатная поля в
группе
выбирает заключается в том, что двигатель не имеет возможности узнать, какая запись's на поле он должен вернуться в этом случае. Это первый? Это в последний раз? Обычно нет записи, что, естественно, соответствует агрегированный результат ("мин" и "Макс" и исключения).Однако, есть обходной путь: Обязательное поле агрегированы, а также. В posgres, это должно работать:
Обратите внимание, что это создает массив всех wnames, заказал на AVG, и возвращает первый элемент (массивы в Postgres-это с 1).
Используя
ранг()
окно:Примечание
Либо один будет сохранить несколько максимальных значений в группе. Если вы хотите только одну запись в группе, даже если есть более одной записи с СР равным Max, вы должны проверить @ypercube'ы ответ.
Для меня, речь идет не о том, что "общие проблемы на" агрегации;, но просто неправильный SQL-запрос. Один правильный ответ и"выберите максимальное AVG для каждого типа CNAME..." это
Результат будет:
Этот результат в целом отвечает на вопрос "что является лучшим результатом для каждой группы?&и". Мы видим, что лучший результат для Испании-это 5 и для Канады лучшим результатом является 2. Это правда, и ошибки нет. Если нам нужно вывести wmname также, мы должны ответить на вопрос: "Что это правила чтобы выбрать wmname из результирующего набора?" Давайте's поменять входные данные немного прояснить ошибку:
Какой результат вы ожидаете на запуск этого запроса:
выбрать CNAME, wmname, максимум(в среднем) от группы makerar на запись CNAME;
? Она должна бытьИспания+Луффи " или " Испания+Усопп
? Почему? Это не определена на запрос Как выбрать шампунь&; лучше" по wmname если подходит, поэтому результат тоже не определено. Что's, почему интерпретатор SQL возвращает ошибку - запрос не является правильным.Другими словами, нет правильного ответа на вопрос ", который является лучшим в группе Испания`?&и". Луффи не лучше, чем Усопп, Усопп, потому что имеет тот же "на результат" по.
Я недавно столкнулся с такой проблемой, когда пытаюсь считать с помощью
случае
, и обнаружили, что изменение порядкачто
иcount
заявления исправления проблемы:Вместо того, чтобы использовать - в последнем, где я получил ошибки, что яблоки и апельсины должны появиться в агрегатные функции
Это похоже на работу