Colonnes de clé de tri étendues
La raison pour laquelle ce que vous voulez faire ne fonctionne pas est à cause de l' ordre logique des opérations dans SQL , qui, pour votre première requête, est (simplifié):
FROM MonitoringJob
SELECT Category, CreationDate
c'est-à-dire ajouter une colonne de clé de tri étendue
ORDER BY CreationDate DESC
SELECT Category
c'est-à-dire supprimer à nouveau la colonne de clé de tri étendue du résultat.
Ainsi, grâce à la fonctionnalité de colonne de clé de tri étendue standard SQL , il est tout à fait possible de trier par quelque chose qui n'est pas dans la SELECT
clause, car il y est temporairement ajouté en arrière-plan.
Alors, pourquoi cela ne fonctionne-t-il pas avec DISTINCT
?
Si nous ajoutons l' DISTINCT
opération, elle serait ajoutée entre SELECT
et ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Mais maintenant, avec la colonne de clé de tri étendue CreationDate
, la sémantique duDISTINCT
opération a été modifiée, de sorte que le résultat ne sera plus le même. Ce n'est pas ce que nous voulons, donc le standard SQL et toutes les bases de données raisonnables interdisent cette utilisation.
Solutions de contournement
Il peut être émulé avec la syntaxe standard comme suit
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
Ou, tout simplement (dans ce cas), comme le montre également Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
J'ai blogué sur SQL DISTINCT et ORDER BY plus en détail ici .