Buscar..
Utilice ORDER BY con TOP para devolver las filas superiores x basadas en el valor de una columna
En este ejemplo, podemos usar GROUP BY no solo para determinar el tipo de filas devueltas, sino también qué filas se devuelven, ya que estamos usando TOP para limitar el conjunto de resultados.
Digamos que queremos devolver a los 5 principales usuarios con mayor reputación de un sitio de preguntas y respuestas popular sin nombre.
Sin ORDENAR
Esta consulta devuelve las 5 filas principales ordenadas por el valor predeterminado, que en este caso es "Id", la primera columna de la tabla (aunque no es una columna que se muestra en los resultados).
SELECT TOP 5 DisplayName, Reputation
FROM Users
devoluciones...
Nombre para mostrar | Reputación |
---|---|
Comunidad | 1 |
Geoff Dalgas | 12567 |
Jarrod dixon | 11739 |
Jeff Atwood | 37628 |
Joel Spolsky | 25784 |
Con ORDENAR
SELECT TOP 5 DisplayName, Reputation
FROM Users
ORDER BY Reputation desc
devoluciones...
Nombre para mostrar | Reputación |
---|---|
JonSkeet | 865023 |
Darin Dimitrov | 661741 |
Balus | 650237 |
Hans Passant | 625870 |
Marc Gravell | 601636 |
Observaciones
Algunas versiones de SQL (como MySQL) usan una cláusula LIMIT
al final de SELECT
, en lugar de TOP
al principio, por ejemplo:
SELECT DisplayName, Reputation
FROM Users
ORDER BY Reputation DESC
LIMIT 5
Clasificación por columnas múltiples
SELECT DisplayName, JoinDate, Reputation FROM Users ORDER BY JoinDate, Reputation
Nombre para mostrar | Fecha de Ingreso | Reputación |
---|---|---|
Comunidad | 2008-09-15 | 1 |
Jeff Atwood | 2008-09-16 | 25784 |
Joel Spolsky | 2008-09-16 | 37628 |
Jarrod dixon | 2008-10-03 | 11739 |
Geoff Dalgas | 2008-10-03 | 12567 |
Clasificación por número de columna (en lugar de nombre)
Puede usar el número de una columna (donde la columna de la izquierda es '1') para indicar en qué columna se basa la clasificación, en lugar de describir la columna por su nombre.
Pro: Si crees que es probable que cambies los nombres de las columnas más adelante, hacerlo no romperá este código.
Contras: esto generalmente reducirá la legibilidad de la consulta (se aclara instantáneamente lo que significa 'ORDENAR POR Reputación', mientras que 'ORDENAR POR 14' requiere un recuento, probablemente con un dedo en la pantalla).
Esta consulta ordena el resultado por la información en la posición de columna relativa 3
de la declaración de selección en lugar del nombre de columna Reputation
.
SELECT DisplayName, JoinDate, Reputation FROM Users ORDER BY 3
Nombre para mostrar | Fecha de Ingreso | Reputación |
---|---|---|
Comunidad | 2008-09-15 | 1 |
Jarrod dixon | 2008-10-03 | 11739 |
Geoff Dalgas | 2008-10-03 | 12567 |
Joel Spolsky | 2008-09-16 | 25784 |
Jeff Atwood | 2008-09-16 | 37628 |
Ordenar por Alias
Debido al orden de procesamiento de consultas lógicas, el alias se puede usar en orden por.
SELECT DisplayName, JoinDate as jd, Reputation as rep
FROM Users
ORDER BY jd, rep
Y puede usar el orden relativo de las columnas en la declaración de selección. Considere el mismo ejemplo que el anterior y en lugar de usar el alias use el orden relativo, ya que para el nombre de visualización es 1, para Jd es 2 y así sucesivamente
SELECT DisplayName, JoinDate as jd, Reputation as rep
FROM Users
ORDER BY 2, 3
Orden de clasificación personalizado
Para ordenar esta tabla Employee
por departamento, usaría ORDER BY Department
. Sin embargo, si desea un orden de clasificación diferente que no sea alfabético, debe asignar los valores del Department
valores diferentes que se clasifiquen correctamente; Esto se puede hacer con una expresión CASE:
Nombre | Departamento |
---|---|
Hasan | ESO |
Yusuf | HORA |
Hillary | HORA |
Joe | ESO |
Alegre | HORA |
Conocer | Contador |
SELECT *
FROM Employee
ORDER BY CASE Department
WHEN 'HR' THEN 1
WHEN 'Accountant' THEN 2
ELSE 3
END;
Nombre | Departamento |
---|---|
Yusuf | HORA |
Hillary | HORA |
Alegre | HORA |
Conocer | Contador |
Hasan | ESO |
Joe | ESO |