Je veux sélectionner tous les order_ids distincts de ma table et trier cette liste par colonne de date. L'utilisation de DISTINCT est bien sûr un paramètre à l'échelle de la requête, donc essayer quelque chose comme ceci ne fonctionne pas :

SELECT DISTINCT(orderId, datetime) 
FROM table 
ORDER BY datetime DESC

Cela renvoie toutes les combinaisons DISTINCT de orderId et de datetime, il me reste donc plusieurs orderId, ce que je ne veux pas. Par conséquent, je pense que la clause DISTINCT n'est pas la voie à suivre. Est-ce que n'importe qui a des suggestions sur la façon dont je pourrais résoudre ce problème ?

Merci!

12
Erebus 23 nov. 2009 à 22:47

3 réponses

Meilleure réponse

S'il y a plusieurs lignes pour la commande, quelle date voulez-vous afficher ? peut-être:

SELECT [orderId], MAX([datetime])
FROM [table]
GROUP BY [orderId]
ORDER BY MAX([datetime]) DESC
21
Marc Gravell 23 nov. 2009 à 22:50
En guise de suivi, et si je voulais sélectionner toutes les valeurs de la table, pas seulement orderId et datetime ? J'ai l'impression que c'est une question totalement distincte, mais...
 – 
Erebus
23 nov. 2009 à 23:03
Vous devrez soit agréger toutes les colonnes, soit sélectionner une ligne particulière (min(id), max(id) ou similaire) et effectuer une jointure/sous-requête.
 – 
Marc Gravell♦
23 nov. 2009 à 23:33

Peut-être qu'un CTE aiderait :

WITH CTE
AS
(

SELECT orderId FROM table ORDER BY datetime DESC

)

SELECT DISTINCT orderId  FROM CTE
3
unclepaul84 23 nov. 2009 à 22:54
Merci pour la correction, j'ai oublié un instant que ce n'est pas le forum MSDN SQL :)
 – 
unclepaul84
23 nov. 2009 à 23:16
Dit "La clause ORDER BY n'est pas valide dans les vues, les fonctions en ligne, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP, OFFSET ou FOR XML est également spécifié.".
 – 
Atomosk
11 juil. 2015 à 16:53
SQL Server garantit-il le maintien de l'ordre du CTE ? Cela semble être une chose interne très risquée sur laquelle s'appuyer, même si cela fonctionne. D'autant plus qu'il existe des solutions formellement correctes, qui garantissent le résultat souhaité.
 – 
Lukas Eder
20 juil. 2018 à 12:18
SELECT DISTINCT * FROM 
  (SELECT value1 
   FROM table1 
   ORDER BY value2);

Cela a fonctionné pour moi.

0
jank 27 juin 2014 à 15:33
Ceci est une erreur. La base de données est libre d'ignorer la clause ORDER BY de la table dérivée, ce qu'elle fera effectivement lorsque DISTINCT est implémenté à l'aide du hachage, par ex. dans une requête plus complexe. Votre implémentation concrète d'optimiseur de base de données peut avoir accidentellement produit le résultat souhaité, mais vous ne devez pas vous y fier !
 – 
Lukas Eder
20 juil. 2018 à 11:27