Columnas de clave de clasificación extendidas
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 una columna de clave de clasificación extendida
ORDER BY CreationDate DESC
SELECT Category
es decir, elimine la columna de clave de clasificación extendida nuevamente del resultado.
Por lo tanto, gracias a la función de columna de clave de ordenación extendida estándar de SQL , es totalmente posible ordenar por algo que no está en la SELECT
cláusula, porque se está agregando temporalmente detrás de escena.
Entonces, ¿por qué no funciona esto DISTINCT
?
Si sumamos la DISTINCT
operación, se sumaría entre SELECT
y ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Pero ahora, con la columna de clave de ordenación extendida CreationDate
, DISTINCT
se ha cambiado la semántica de 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 la 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 también lo muestra 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 más en detalle aquí .