Después de ejecutar la siguiente declaración:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Obtengo los siguientes valores de la base de datos:
test3
test3
bildung
test4
test3
test2
test1
pero quiero que se eliminen los duplicados, así:
bildung
test4
test3
test2
test1
Intenté usar DISTINCT pero no funciona con ORDER BY en una declaración. Por favor ayuda.
Importante:
Lo probé con:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
no funciona.
Ordenar por CreationDate es muy importante.
Respuestas:
El problema es que las columnas utilizadas en
ORDER BY
no se especifican enDISTINCT
. Para hacer esto, necesita usar una función agregada para ordenar y usar aGROUP BY
para hacer elDISTINCT
trabajo.Intente algo como esto:
fuente
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 extendidaORDER 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 entreSELECT
yORDER 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
O simplemente (en este caso), como también lo muestra Prutswonder
He escrito en un blog sobre SQL DISTINCT y ORDER BY más en detalle aquí .
fuente
DISTINCT ON
funciona y bastante seguro de que no ayuda aquí. La expresión entre paréntesis es lo que se utiliza para determinar la distinción (la condición de agrupación). Si hay diferentes categorías con lo mismoCreationDate
, ¡solo una de ellas aparecerá en el resultado! Como me preguntaba si tal vez estaba equivocado de alguna manera, también cargué la base de datos de ejemplo en la publicación de su blog para verificarla: laDISTINCT ON
consulta que dio allí produjo un total de 1000 resultados (con muchos duplicadoslength
) mientras que la consulta a continuación dio solo 140 valores (únicos).DISTINCT
(noON
) y otra que usaDISTINCT ON
. Tenga en cuenta que este último no elimina explícitamente las longitudes duplicadas, sino los títulos duplicados. Creo que mi respuesta aquí es completamente correcta.DISTINCT ON
condiciones están eliminando duplicados usando la condición incorrecta. En la publicación de su blog, laDISTINCT ON
consulta elimina los títulos duplicados , sin embargo, laDISTINCT
consulta que está encima y la que se encuentra debajo (para la que afirma que es "azúcar sintáctico") eliminan las longitudes duplicadas , ya que presumiblemente ese es el objetivo. Lo mismo se aplica aquí: el OP quiere que se eliminen las Categorías duplicadas , no las CreationDates duplicadas como lo hace laDISTINCT ON
consulta. Si aún no me cree, pruébelo usted mismo.Si no se desea la salida de MAX (CreationDate), como en el ejemplo de la pregunta original, la única respuesta es la segunda declaración de la respuesta de Prashant Gupta:
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 poner una selección externa alrededor y descartar la parte MAX (CreationDate).
fuente
Simplemente use este código, si desea valores de las columnas [Categoría] y [Fecha de creación]
O use este código, si solo desea valores de la columna [Categoría].
Tendrás todos los registros distintos que quieras.
fuente
Event
, puede escribir en[Event]
lugar deEvent
evitar que SQL arroje un error de análisis.Los resultados originales indicaron que "test3" tenía varios resultados ...
Es muy fácil comenzar a usar MAX todo el tiempo para eliminar duplicados en Group By's ... y olvidar o ignorar cuál es la pregunta subyacente ...
El OP presumiblemente se dio cuenta de que usar MAX le estaba dando el último "creado" y usar MIN daría el primer "creado" ...
fuente
MAX
, en lugar de algo que sea independiente como respuesta a la pregunta.fuente
Por subconsulta, debería funcionar:
fuente
Distinct clasificará los registros en orden ascendente. Si desea ordenar en orden desc, use:
Si desea ordenar los registros según el campo CreationDate, este campo debe estar en la declaración de selección:
fuente
Puede utilizar CTE:
fuente
Intente a continuación, pero no es útil para datos enormes ...
fuente
ORDER BY
en subconsultas es absolutamente válido. Y alguien incluso votó a favor de tu comentario incorrecto.Se puede hacer usando una consulta interna como esta
fuente
fuente