2 votes

Sélectionner les 20 premières lignes distinctes de la requête

Je conserve un journal des actions de l'utilisateur dans un tableau avec un horodatage.

Chaque fois qu'un utilisateur accède à un projet, le système enregistre le fait qu'il a consulté ce projet et indique la date.

Je souhaite obtenir les 20 projets les plus importants auxquels l'utilisateur a accédé pour la dernière fois.

Voici ce que j'ai jusqu'à présent :

SELECT DISTINCT TOP (20) Users_Tran_ID
FROM App_UserLog
WHERE (Users_ID = 'ADMIN') AND (Users_Transaction LIKE 'Permit Viewed%')
ORDER BY App_UserLog.Users_LogDate DESC

Le problème est que je ne veux pas de Users_LogDate dans mon résultat, car j'ai besoin de Users_Tran_ID UNIQUE.

Lorsque je supprime le champ Users_LogDate du SELECT, j'obtiens l'erreur suivante :

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

Voici la sélection de base et l'ensemble des résultats que j'obtiens. Je ne veux que l'identifiant distinct Users_Tran_ID et seulement le TOP 20.

ADMIN   Permit Viewed   B2011-0012  2013-08-29 17:35:04.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 17:29:09.000
ADMIN   Permit Viewed   B2006-0043  2013-08-29 17:29:05.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 17:28:49.000
ADMIN   Permit Viewed   B2008-0167  2013-08-29 17:17:13.000
ADMIN   Permit Viewed   B2006-0043  2013-08-29 17:17:08.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 17:16:55.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 17:16:45.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 17:16:38.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 17:16:32.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 11:39:59.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 11:22:05.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 11:22:03.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:23:17.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:21:58.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:20:41.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:20:37.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 10:18:01.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 10:17:58.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:17:54.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:01:50.000
ADMIN   Permit Viewed   B2011-0012  2013-08-29 10:01:48.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 09:56:32.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 09:53:31.000
ADMIN   Permit Viewed   B2007-0478  2013-08-29 09:53:27.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-15 12:51:09.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-15 12:51:07.000
ADMIN   Permit Viewed   BLD2012-0094    2013-08-13 12:01:39.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:34.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:28.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:24.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:21.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:13.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:09.000
ADMIN   Permit Viewed   ENG2013-0047    2013-08-05 10:40:07.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-05 10:37:55.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-05 10:37:50.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-05 10:37:46.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-05 10:37:40.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-05 10:37:33.000
ADMIN   Permit Viewed   ENG2012-0141    2013-08-05 10:37:31.000
ADMIN   Permit Viewed   BLD2012-0919    2013-08-05 10:27:21.000
ADMIN   Permit Viewed   BLD2012-0919    2013-08-05 10:27:17.000
ADMIN   Permit Viewed   ENG2012-0119    2013-08-05 10:26:51.000
ADMIN   Permit Viewed   ENG2012-0119    2013-08-05 10:26:48.000

Comment faire ?

5voto

Gordon Linoff Points 213350

Vous souhaitez utiliser group by plutôt que distinct :

SELECT TOP (20) Users_Tran_ID
FROM App_UserLog
WHERE (Users_ID = 'ADMIN') AND (Users_Transaction LIKE 'Permit Viewed%')
GROUP BY Users_Tran_ID
ORDER BY max(App_UserLog.Users_LogDate) DESC;

Avec l'agrégation, vous pouvez alors spécifier que vous souhaitez classer les données en fonction de la date d'enregistrement la plus récente. Voilà qui devrait faire l'affaire.

2voto

FrankPl Points 9921
SELECT Users_ID, Users_Transaction, Users_Tran_ID
FROM (
    SELECT DISTINCT TOP (20) Users_ID, Users_Transaction, Users_Tran_ID, Users_LogDate
    FROM App_UserLog
    WHERE (Users_ID = 'ADMIN') AND (Users_Transaction LIKE 'Permit Viewed%')
    ORDER BY App_UserLog.Users_LogDate DESC
) as a

1voto

Fabien TheSolution Points 4790

Vous cherchez quelque chose comme ceci :

SELECT TOP 20 Users_ID, 
              Users_Transaction, 
              Users_Tran_ID 
         FROM ( SELECT Users_ID, 
                       Users_Transaction, 
                       Users_Tran_ID, 
                       max(Users_LogDate) as MaxUsers_LogDate
                  FROM App_UserLog
                 WHERE (Users_ID = 'ADMIN') AND 
                       (Users_Transaction LIKE 'Permit Viewed%')
              GROUP BY Users_ID, Users_Transaction, Users_Tran_ID
             ) AS TopTransactions
ORDER BY MaxUsers_LogDate DESC

Voir SQLFIDDLE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X