Ответ 1
SELECT TOP 3 UserId, DocumentId, MAX(CreatedDate)
FROM MyTable
WHERE UserId = 71
GROUP BY UserId, DocumentId
ORDER BY MAX(CreatedDate) DESC
У меня есть одна таблица, в которой мне нужно отменить 5 последних записей на основе идентификатора пользователя и отключение идентификатора документа (без дубликатов). В основном, я отслеживаю посещаемые страницы и пытается отбросить 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
Select USERID,DOCUMENT ID
FROM yourtable
QUALIFY ROW_NUMBER OVER(Partition by user id ORDER By document id Desc)<6
Это работает в Teradata. Надеюсь, что это работает и на Sql Server, в основном в ANSI SQL.