Для SQL Server 2005/2008 мы можем использовать CTE и ROW_NUMBER (), чтобы получить то, что мы хотим ... это не проверено, но должно работать:
;WITH numbered AS (
SELECT userId, date, textId, speed,
ROW_NUMBER() OVER (PARTITION BY userId ORDER BY date DESC) AS user_row_number
FROM UserTypedText
)
SELECT userId, date, textId, speed
FROM numbered
WHERE user_row_number <= 10
ORDER BY userId, date
Это возвращает первые 10 для каждогопользователь в едином наборе результатов, упорядоченный пользователем и датой.