Colonne chiave di ordinamento estese
Il motivo per cui ciò che vuoi fare non funziona è a causa dell'ordine logico delle operazioni in SQL , che, per la tua prima query, è (semplificato):
FROM MonitoringJob
SELECT Category, CreationDate
cioè aggiungere una cosiddetta colonna chiave di ordinamento estesa
ORDER BY CreationDate DESC
SELECT Category
cioè rimuovere di nuovo la colonna della chiave di ordinamento estesa dal risultato.
Quindi, grazie alla funzionalità della colonna chiave di ordinamento estesa standard SQL , è totalmente possibile ordinare qualcosa che non è nella SELECT
clausola, perché viene temporaneamente aggiunto dietro le quinte.
Allora, perché non funziona con DISTINCT
?
Se aggiungiamo l' DISTINCT
operazione, verrebbe aggiunta tra SELECT
e ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Ma ora, con la colonna chiave di ordinamento estesa CreationDate
, la semantica DISTINCT
dell'operazione è stata modificata, quindi il risultato non sarà più lo stesso. Questo non è ciò che vogliamo, quindi sia lo standard SQL che tutti i database ragionevoli vietano questo utilizzo.
soluzioni alternative
Può essere emulato con la sintassi standard come segue
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
O semplicemente semplicemente (in questo caso), come mostrato anche da Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
Ho scritto sul blog di SQL DISTINCT e ORDER BY più in dettaglio qui .