max (), сгруппировать по и упорядочить по - PullRequest
4 голосов
/ 10 июня 2011

У меня следующий оператор SQL.

    SELECT t.client_id,max(t.points) AS "max" FROM sessions GROUP BY t.client_id;

В нем просто перечислены идентификаторы клиентов с максимальным количеством набранных ими баллов.Теперь я хочу отсортировать результаты по максимуму (t.points).Обычно я бы использовал ORDER BY, но я не знаю, как использовать его с группами.Я знаю, что использование значений из списка SELECT запрещено в следующих пунктах, поэтому добавление ORDER BY max в конце запроса не будет работать.

Как я могу отсортировать эти результаты после группировки, тогда?

С наилучшими пожеланиями

Ответы [ 3 ]

7 голосов
/ 10 июня 2011
SELECT t.client_id, max(t.points) AS "max" 
FROM sessions t
GROUP BY t.client_id 
order by max(t.points) desc
1 голос
/ 10 июня 2011

Не совсем правильно, что значения из списка SELECT запрещены в следующих пунктах. Фактически, ORDER BY логически обрабатывается после списка SELECT и может ссылаться на имена результатов списка SELECT (в отличие от GROUP BY). Таким образом, нормальный способ написать ваш запрос будет

SELECT t.client_id, max(t.points) AS "max"
    FROM sessions
    GROUP BY t.client_id
    ORDER BY max;

Этот способ выразить это SQL-92 и должен быть очень переносимым. Другой способ сделать это - по номеру столбца, например,

    ORDER BY 2;

Это единственный способ сделать это в SQL-92.

SQL: 1999 и более поздние версии также позволяют ссылаться на произвольные выражения в списке сортировки, так что вы можете просто сделать ORDER BY max(t.points), но это явно более громоздко и, возможно, менее переносимо. Упорядочение по номеру столбца было удалено в SQL: 1999, поэтому технически оно больше не является стандартным, но, вероятно, все еще широко поддерживается.

0 голосов
/ 10 июня 2011

Поскольку вы пометили как Postgres : Postgres допускает нестандартный GROUP BY и ORDER BY номер столбца.Таким образом, вы могли бы иметь

SELECT t.client_id, max(t.points) AS "max" 
FROM sessions t
GROUP BY 1 
order by 2 desc

После анализа это идентично решению RedFilter.

...