Luego de consultar con expertos en este tema, programadores de varias ramas y profesores dimos con la respuesta a la interrogande y la compartimos en esta publicación.
Solución:
El problema es que las columnas utilizadas en el ORDER BY
no están especificados en el DISTINCT
. Para hacer esto, necesita usar una función agregada para ordenar y usar un GROUP BY
para hacer el DISTINCT
trabaja.
Prueba algo como esto:
SELECT DISTINCT Category, MAX(CreationDate)
FROM MonitoringJob
GROUP BY Category
ORDER BY MAX(CreationDate) DESC, Category
Clasificación extendida key columnas
La razón por la que lo que quiere hacer no funciona es por el orden lógico de las operaciones en SQL, que, para su primera consulta, es (simplificado):
FROM MonitoringJob
SELECT Category, CreationDate
es decir, agregue un llamado clasificación extendida key columnaORDER BY CreationDate DESC
SELECT Category
es decir quitar el clasificación extendida key columna de nuevo del resultado.
Entonces, gracias al estándar SQL clasificación extendida key columna característica, es totalmente posible ordenar por algo que no está en el SELECT
cláusula, porque se le agrega temporalmente detrás de escena.
Entonces, ¿por qué esto no funciona con DISTINCT
?
Si añadimos el DISTINCT
operación, se añadiría entre SELECT
y ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Pero ahora, con el clasificación extendida key columnaCreationDate
la semántica de la DISTINCT
Se ha cambiado la operación, por lo que el resultado ya no será el mismo. Esto no es lo que queremos, por lo que tanto el estándar SQL como todas las bases de datos razonables prohíben este uso.
Soluciones alternativas
Se puede emular con sintaxis estándar de la siguiente manera
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
O, simplemente (en este caso), como lo muestra también Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
He escrito en un blog sobre SQL DISTINCT y ORDER BY con más detalle aquí.
Si no se desea la salida de MAX (Fecha de creación), como en el ejemplo de la pregunta original, la única respuesta es la segunda declaración de la respuesta de Prashant Gupta:
SELECT [Category] FROM [MonitoringJob]
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC
Explicación: no puede usar la cláusula ORDER BY en una función en línea, por lo que la declaración en la respuesta de Prutswonder no se puede usar en este caso, no puede colocar una selección externa alrededor y descartar la parte MAX (Fecha de creación).
Si posees alguna cuestión y disposición de renovar nuestro tutorial eres capaz de añadir un paráfrasis y con placer lo analizaremos.