Colonnes clés de tri étendues
La raison pour laquelle ce que vous voulez faire ne fonctionne pas est due à la l'ordre logique des opérations en SQL, comme je l'ai expliqué dans cet article du blog ce qui, pour votre première question, est (simplifié) :
FROM MonitoringJob
-
SELECT Category, CreationDate
c'est-à-dire ajouter un soi-disant colonne clé de tri étendue
ORDER BY CreationDate DESC
-
SELECT Category
c'est-à-dire supprimer le colonne clé de tri étendue à partir du résultat.
Ainsi, grâce à la norme SQL colonne clé de tri étendue Il est tout à fait possible de commander par un élément qui n'est pas dans la liste. SELECT
parce qu'elle lui est temporairement ajoutée en coulisses.
Pourquoi cela ne fonctionne-t-il pas avec DISTINCT
?
Si nous ajoutons le DISTINCT
l'opération, il serait ajouté entre SELECT
y ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Mais aujourd'hui, avec la colonne clé de tri étendue CreationDate
, la sémantique de la DISTINCT
a été modifiée, de sorte que le résultat ne sera plus le même. Ce n'est pas ce que nous voulons, c'est pourquoi la norme SQL et toutes les bases de données raisonnables interdisent cette utilisation.
Solutions de rechange
Il peut être émulé avec la syntaxe standard suivante
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 montrent également les exemples suivants Prutswonder
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
J'ai fait un blog sur SQL DISTINCT et ORDER BY plus en détail ici. .