Après avoir exécuté l'instruction suivante:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
J'obtiens les valeurs suivantes de la base de données:
test3
test3
bildung
test4
test3
test2
test1
mais je veux que les doublons soient supprimés, comme ceci:
bildung
test4
test3
test2
test1
J'ai essayé d'utiliser DISTINCT mais cela ne fonctionne pas avec ORDER BY dans une instruction. Veuillez aider.
Important:
Je l'ai essayé avec:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
ça ne marche pas.
La commande par CreationDate est très importante.
Réponses:
Le problème est que les colonnes utilisées dans le
ORDER BY
ne sont pas spécifiées dans leDISTINCT
. Pour ce faire, vous devez utiliser une fonction d'agrégation pour effectuer le tri et utiliser aGROUP BY
pour effectuer leDISTINCT
travail.Essayez quelque chose comme ceci:
la source
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 étendueORDER 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 entreSELECT
etORDER 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
Ou, tout simplement (dans ce cas), comme le montre également Prutswonder
J'ai blogué sur SQL DISTINCT et ORDER BY plus en détail ici .
la source
DISTINCT ON
fonctionne et à peu près sûr que cela n'aide pas ici. L'expression entre parenthèses est ce qui est utilisé pour déterminer la distinction (la condition de regroupement). S'il y a différentes catégories avec la même chose,CreationDate
une seule d'entre elles apparaîtra dans le résultat! Comme je me demandais si j'avais peut-être tort, j'ai également chargé la base de données d'exemple dans votre article de blog pour vérifier: laDISTINCT ON
requête que vous y avez donnée a produit un total de 1000 résultats (avec beaucoup de doublonslength
) tandis que la requête ci-dessous a donné seulement 140 valeurs (uniques).DISTINCT
(nonON
) et une qui utiliseDISTINCT ON
. Veuillez noter que ce dernier ne supprime pas explicitement les longueurs en double, mais les titres en double. Je pense que ma réponse ici est tout à fait correcte.DISTINCT ON
conditions suppriment les doublons en utilisant la mauvaise condition. Dans votre article de blog, laDISTINCT ON
requête supprime effectivement les titres en double , mais laDISTINCT
requête au-dessus et la requête en dessous (pour laquelle vous prétendez qu'il s'agit d'un «sucre de syntaxe») suppriment toutes les deux les longueurs en double , car c'est vraisemblablement l'objectif global. La même chose s'applique ici: l'OP veut que les catégories en double soient supprimées, pas les CreationDates en double comme leDISTINCT ON
fait la requête. Si vous ne me croyez toujours pas, testez par vous-même.Si la sortie de MAX (CreationDate) n'est pas souhaitée - comme dans l'exemple de la question d'origine - la seule réponse est la deuxième déclaration de la réponse de Prashant Gupta:
Explication: vous ne pouvez pas utiliser la clause ORDER BY dans une fonction en ligne, donc l'instruction dans la réponse de Prutswonder n'est pas utilisable dans ce cas, vous ne pouvez pas mettre une sélection externe autour d'elle et supprimer la partie MAX (CreationDate).
la source
Utilisez simplement ce code, si vous voulez des valeurs des colonnes [Category] et [CreationDate]
Ou utilisez ce code, si vous ne voulez que les valeurs de la colonne [Category].
Vous aurez tous les enregistrements distincts que vous voulez.
la source
Event
vous pouvez écrire[Event]
au lieu deEvent
pour empêcher SQL de lancer une erreur d'analyse.Les résultats originaux indiquaient que «test3» avait plusieurs résultats ...
Il est très facile de commencer à utiliser MAX tout le temps pour supprimer les doublons dans Group By ... et oublier ou ignorer la question sous-jacente ...
L'OP s'est vraisemblablement rendu compte que l'utilisation de MAX lui donnait le dernier "créé" et l'utilisation de MIN donnerait le premier "créé" ...
la source
MAX
, plutôt que quelque chose qui constitue une réponse autonome à la question.la source
Par sous-requête, cela devrait fonctionner:
la source
Distinct triera les enregistrements par ordre croissant. Si vous souhaitez trier par ordre décroissant, utilisez:
Si vous souhaitez trier les enregistrements en fonction du champ CreationDate, ce champ doit se trouver dans l'instruction select:
la source
Vous pouvez utiliser CTE:
la source
Essayez ensuite, mais ce n'est pas utile pour les données volumineuses ...
la source
ORDER BY
dans les sous-requêtes est absolument valide. Et quelqu'un a même voté pour votre commentaire incorrect.Cela peut être fait en utilisant une requête interne comme ceci
la source
la source