Depois de executar a seguinte declaração:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Estou recebendo os seguintes valores do banco de dados:
test3
test3
bildung
test4
test3
test2
test1
mas quero que as duplicatas sejam removidas, assim:
bildung
test4
test3
test2
test1
Tentei usar DISTINCT, mas não funciona com ORDER BY em uma instrução. Por favor ajude.
Importante:
Eu tentei com:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
não funciona.
O pedido por data de criação é muito importante.
Respostas:
O problema é que as colunas usadas no
ORDER BY
não são especificadas noDISTINCT
. Para fazer isso, você precisa usar uma função agregada para classificar e usar umGROUP BY
para fazer oDISTINCT
trabalho.Experimente algo assim:
fonte
Colunas-chave de classificação estendida
O motivo pelo qual o que você deseja fazer não funciona é a ordem lógica das operações em SQL , que, para sua primeira consulta, é (simplificada):
FROM MonitoringJob
SELECT Category, CreationDate
ou seja, adicione a chamada coluna de chave de classificação estendidaORDER BY CreationDate DESC
SELECT Category
ou seja, remova a coluna de chave de classificação estendida novamente do resultado.Portanto, graças ao recurso de coluna-chave de classificação estendida do padrão SQL , é totalmente possível ordenar por algo que não está na
SELECT
cláusula, porque está sendo adicionado temporariamente a ele nos bastidores.Então, por que isso não funciona com
DISTINCT
?Se adicionarmos a
DISTINCT
operação, ela será adicionada entreSELECT
eORDER BY
:FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Mas agora, com a coluna de chave de classificação estendida
CreationDate
, a semântica daDISTINCT
operação foi alterada, portanto, o resultado não será mais o mesmo. Isso não é o que queremos, portanto, o padrão SQL e todos os bancos de dados razoáveis proíbem esse uso.Soluções Alternativas
Pode ser emulado com a sintaxe padrão da seguinte maneira
Ou, simplesmente (neste caso), como mostrado também por Prutswonder
Eu tenho um blog sobre SQL DISTINCT e ORDER BY mais detalhadamente aqui .
fonte
DISTINCT ON
funciona e tenho certeza de que não ajuda aqui. A expressão entre parênteses é o que é usado para determinar a distinção (a condição de agrupamento). Se houver categorias diferentes com as mesmasCreationDate
, apenas uma delas aparecerá no resultado! Como estava me perguntando se talvez eu estivesse errado de alguma forma, também carreguei o banco de dados de exemplo em sua postagem de blog para verificar novamente: aDISTINCT ON
consulta que você forneceu produziu um total de 1000 resultados (com muitas duplicataslength
), enquanto a consulta abaixo deu apenas 140 valores (únicos).DISTINCT
(nãoON
) e outra que usaDISTINCT ON
. Observe que o último explicitamente não remove comprimentos duplicados, mas títulos duplicados. Eu realmente acho que minha resposta aqui está totalmente correta.DISTINCT ON
condições estão removendo duplicatas usando a condição errada. Em sua postagem no blog, aDISTINCT ON
consulta realmente remove títulos duplicados , no entanto, aDISTINCT
consulta acima e a consulta abaixo (que você afirma ser "sintaxe sugar" para) removem comprimentos duplicados , pois esse é provavelmente o objetivo inteiro. A mesma coisa se aplica aqui: o OP deseja que as Categorias duplicadas sejam removidas, não as CreationDates duplicadas como aDISTINCT ON
consulta faz. Se você ainda não acredita em mim, teste você mesmo.Se a saída de MAX (CreationDate) não for desejada - como no exemplo da pergunta original - a única resposta é a segunda declaração da resposta de Prashant Gupta:
Explicação: você não pode usar a cláusula ORDER BY em uma função embutida, portanto, a instrução na resposta de Prutswonder não é utilizável neste caso, você não pode colocar um select externo em torno dela e descartar a parte MAX (CreationDate).
fonte
Basta usar este código, se desejar valores das colunas [Category] e [CreationDate]
Ou use este código, se quiser apenas os valores da coluna [Categoria].
Você terá todos os registros distintos o que quiser.
fonte
Event
você pode escrever em[Event]
vez deEvent
impedir que o SQL lance um erro de análise.Os resultados originais indicaram que "test3" teve vários resultados ...
É muito fácil começar a usar MAX o tempo todo para remover duplicatas em Group By's ... e esquecer ou ignorar qual é a questão subjacente ...
O OP presumivelmente percebeu que usar MAX estava dando a ele o último "criado" e usando MIN daria o primeiro "criado" ...
fonte
MAX
, ao invés de algo que permanece sozinho como uma resposta à pergunta.fonte
Por subconsulta, deve funcionar:
fonte
Distinct classificará os registros em ordem crescente. Se você deseja classificar em ordem decrescente, use:
Se você deseja classificar os registros com base no campo CreationDate, este campo deve estar na instrução de seleção:
fonte
Você pode usar CTE:
fonte
Tente a seguir, mas não é útil para dados enormes ...
fonte
ORDER BY
em subconsultas é absolutamente válido. E alguém até votou positivamente em seu comentário incorreto.Isso pode ser feito usando uma consulta interna como esta
fonte
fonte