max (), group by order by

Tengo la siguiente instrucción SQL.

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

Simplemente enumera las identificaciones de los clientes con la cantidad máxima de puntos que han logrado. Ahora quiero orderar los resultados por max (t.points). Normalmente usaría ORDER BY, pero no tengo idea de cómo usarlo con grupos. Sé que usar el valor de la list SELECT está prohibido en las siguientes cláusulas, por lo que no será posible agregar ORDER BY max al final de la consulta.

¿Cómo puedo orderar esos resultados después de agruparlos, entonces?

Atentamente

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

No es del todo correcto que los valores de la list SELECT estén prohibidos en las siguientes cláusulas. De hecho, ORDER BY se procesa lógicamente después de la list SELECT y puede hacer reference a SELECT nombres de resultados de la list (en contraste con GROUP BY ). Entonces, la forma normal de escribir su consulta sería

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

Esta forma de expresslo es SQL-92 y debería ser muy portátil. La otra forma de hacerlo es por número de columna, por ejemplo,

  ORDER BY 2; 

Estas son las dos únicas forms de hacer esto en SQL-92.

SQL: 1999 y posteriores también permiten hacer reference a expresiones arbitrarias en la list de sorting, por lo que puede hacer ORDER BY max(t.points) , pero eso es claramente más engorroso y posiblemente less portátil. La orderación por número de columna se eliminó en SQL: 1999, por lo que técnicamente ya no es estándar, pero probablemente todavía sea ampliamente compatible.

Como ha labeldo como Postgres : Postgres permite un número de columna GROUP BY y ORDER BY no estándar . Entonces podrías tener

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

Después del análisis, es idéntico a la solución de RedFilter.