Saltar al contenido

¿Cómo usar DISTINCT y ORDER BY en la misma instrucción SELECT?

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 columna
  • ORDER 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 columnaCreationDatela 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *