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.