UserIDに基づいて5つの最新のレコードを取得し、documentIDをキーオフする必要がある単一のテーブルがあります(重複なし)。基本的に、私はアクセスしたページを追跡し、ユーザーによる最新の3つを取り戻そうとしています。
サンプルデータ:
╔══════════════════════════════════════════════╗
║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 ║
╚══════════════════════════════════════════════╝
UserID = 71の場合の望ましいクエリ結果:
╔══════════════════════════════════════════════╗
║UserID DocumentID CreatedDate ║
╠══════════════════════════════════════════════╣
║ 71 25 2013-09-09 12:20:37.930 ║
║ 71 22 2013-09-09 12:19:37.930 ║
╚══════════════════════════════════════════════╝
SELECT TOP 3 UserId, DocumentId, MAX(CreatedDate)
FROM MyTable
WHERE UserId = 71
GROUP BY UserId, DocumentId
ORDER BY MAX(CreatedDate) DESC
あなたはこれを試すことができます:
SELECT DISTINCT USERID,
DOCUMENTID,
MAX(CREATEDDATE)
OVER (
PARTITION BY USERID, DOCUMENTID) CREATEDDATE
FROM MYTABLE
WHERE USERID = 71
SQL Fiddle の実際の例を見てください。
幸運を!
[〜#〜] cte [〜#〜] と ROW_NUMBER を使用してみてください。
何かのようなもの
;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