Ordenación múltiple — una herramienta fundamental al generar informes, cuando se requiere clasificar o agrupar datos por varias columnas (por ejemplo, primero por fecha, luego por nombre, luego por suma). Tradicionalmente, la ordenación se realizaba estrictamente por un solo campo, lo que no resuelve el problema del análisis de datos complejos.
El problema a menudo radica en un orden de clasificación incorrecto (por ejemplo, los valores NULL aparecen en lugares inesperados), errores de collation (diferentes reglas lingüísticas para la ordenación de valores de cadena) y caídas en el rendimiento en grandes conjuntos de datos.
Solución: Utilizar un ORDER BY de múltiples columnas, tener en cuenta la especificidad de COLLATION y definir claramente el orden de NULLS para la determinación del resultado, así como verificar la indexación de las columnas para tablas grandes.
Ejemplo de código:
SELECT * FROM sales ORDER BY region COLLATE "ru_RU", date DESC NULLS LAST, total_amount DESC;
Características clave:
Si no se especifica COLLATE, ¿será siempre el mismo orden de clasificación en diferentes servidores?
¡No! COLLATE por defecto depende de la configuración de la base de datos y/o del servidor, y los resultados de la ordenación de cadenas (especialmente con caracteres cirílicos, caracteres especiales) pueden variar entre instalaciones.
¿Dónde se colocan los NULL al ordenar DESC y ASC?
El estándar SQL no lo define de manera concluyente. En algunos SGBD, los NULL van al principio al ASC, en otros — al final. Especifique explícitamente NULLS FIRST o NULLS LAST para que el comportamiento sea transparente.
ORDER BY price DESC NULLS LAST
¿Afecta el ORDER BY de múltiples columnas al uso del índice?
Sí, pero solo si el orden, tipos y limpieza de los valores de las columnas coinciden con el índice compuesto existente. Si el orden es mezclado (ASC/DESC) o se utilizan campos calculados, el índice puede no utilizarse.
El gerente creó un informe con ORDER BY por apellido sin COLLATE. Al trasladar el informe entre diferentes servidores, los apellidos en ruso y en latín cambiaron de lugar, y los NULL estaban a veces al principio, a veces al final.
Pros:
En el informe, se especificó claramente COLLATE y el orden de NULL a través de NULLS FIRST/LAST, se añadió un índice compuesto a los campos de ordenación. El comportamiento dejó de depender del entorno, y la velocidad de la consulta aumentó significativamente.
Pros: