Usando SQL ORDER BY para criterios complejos
-
29-09-2020 - |
Pregunta
Digamos que mi relación es así.
y quería ordenar por rango, pero primero los A y B.Entonces mi relación se verá así
Al principio intenté tener solo dos relaciones, ordenándolas por rango y luego uniendo las dos relaciones, pero terminan mezclándose.También intenté usar casos, pero no entiendo cómo funciona.Seguí recibiendo errores al mezclar caracteres con números enteros.
Editar:Olvidé mencionar que la primera relación anterior es con la que termino después de una cantidad algo compleja de vistas.Por ejemplo, creé dos vistas, una que solo tiene clases A y B, luego las ordené por rango.Segunda vista solo clases C, ordenadas por rango.Luego los uní, pero simplemente se mezclan.
Solución
Sólo necesitas un CASE
expresión en el ORDER BY
, para dividir las filas en dos grupos, de modo que las de clase 'A' o 'B' se coloquen en el primer grupo (1
) y todos los demás en el segundo (2
):
ORDER BY
CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
rank ;
Otros consejos
Les voy a dar un ejemplo de una forma de hacerlo, donde uso CTE, que están disponibles en muchas bases de datos, particularmente PostgreSQL, con el que estoy más familiarizado.
CTE y el WITH
cláusula
CTE le permite formar estructuras temporales similares a tablas de consulta única, pero dado que puede hacer que los CTE dependan unos de otros en una sola consulta, proporciona una manera conveniente y fácil de entender de hacer que su consulta sea semiprocedimental.
En tu caso lo intentaría
WITH AB_results AS(
SELECT class, rank, 1 AS hidden_rank
FROM my_relation
WHERE class IN ('A','B')
),
Non_AB_results AS(
SELECT class, rank, 2 AS hidden_rank
FROM my_relation
WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;
Intentaré armar un SQLFiddle en un par de minutos aquí, solo para asegurarme de no haberme equivocado en algunas de mis consultas.:PAG
EDITAR:Cometí un pequeño error.Intentando limpiarlo con un ejemplo mientras hablamos.
EDITAR 2:¡El error ya está corregido!Desafortunadamente, SQLFiddle está teniendo algunos problemas en este momento, pero AQUÍ es el enlace a SQLFiddle para algunas pruebas.
tenga en cuenta Quizás no haya resuelto esto de la manera más elegante posible, pero debería resolver sus problemas.