web-dev-qa-db-fra.com

Groupe SQL Server par ordre de lieu

J'ai une seule table dont j'ai besoin pour retirer les 5 enregistrements les plus récents en fonction d'un ID utilisateur et de la saisie de l'ID document (pas de doublons). Fondamentalement, je suis le suivi des pages visitées et j'essaie de retirer les 3 plus récentes par utilisateur.

Exemples de données:

╔══════════════════════════════════════════════╗
║UserID   DocumentID   CreatedDate             ║
╠══════════════════════════════════════════════╣
║  71         22       2013-09-09 12:19:37.930 ║
║  71         25       2013-09-09 12:20:37.930 ║
║  72          1       2012-11-09 12:19:37.930 ║
║  99         76       2012-10-10 12:19:37.930 ║
║  71         22       2013-09-09 12:19:37.930 ║
╚══════════════════════════════════════════════╝

Résultats de requête souhaités si UserID = 71:

╔══════════════════════════════════════════════╗
║UserID    DocumentID  CreatedDate             ║
╠══════════════════════════════════════════════╣
║  71         25       2013-09-09 12:20:37.930 ║
║  71         22       2013-09-09 12:19:37.930 ║
╚══════════════════════════════════════════════╝
14
JGrimm
SELECT TOP 3 UserId, DocumentId, MAX(CreatedDate)
FROM MyTable
WHERE UserId = 71
GROUP BY UserId, DocumentId
ORDER BY MAX(CreatedDate) DESC
21
Tom

Vous pouvez essayer ceci:

SELECT DISTINCT USERID, 
                DOCUMENTID, 
                MAX(CREATEDDATE) 
                  OVER ( 
                    PARTITION BY USERID, DOCUMENTID) CREATEDDATE 
FROM   MYTABLE 
WHERE  USERID = 71 

Jetez un œil à l'exemple de travail sur SQL Fiddle .

Bonne chance!

1
Gidil

Vous pouvez essayer d'utiliser un CTE et ROW_NUMBER .

Quelque chose comme

;WITH Vals AS (
    SELECT UserID, 
           DocumentID, 
           ROW_NUMBER() OVER(PARTITION BY UserID, DocumnentID ORDER BY CreatedDate DESC) RowID
    FROM MyTable
)
SELECT TOP 3 *
FROM Vals
WHERE UserID = 71
AND RowID = 1
0
Adriaan Stander