Я пишу базу данных SQL Server, где у меня есть отношение UserTypedText (userId, date, textId, speed). (какой пользователь использует типы, текст которых зависит от скорости) Где (userId, date) является ключом. Поэтому я хочу запросить из этой таблицы последние 10 (отсортированные по дате по убыванию) строки для каждого пользователя. Если пользователь не набрал 10 текстов, то получите всю информацию о его типах. Не могли бы вы помочь мне с этим вопросом? Очень важно делать все это с помощью одного запроса, а не результатов результатов UNION.Не удается написать запрос с использованием SQL Server
ответ
С SQL Server 2005 и более поздних версиях можно использовать ROW_NUMBER с PARTITION BY, чтобы сделать это:
SELECT *
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Date DESC) AS RowNo, *
FROM UserTypedText
) x
WHERE x.RowNo <= 10
Я хотел бы написать хранимую процедуру, которая будет принимать пользовательский идентификатор пользователя, которого вы заинтересованы, и для каждого пользователя:
SELECT TOP 10 *
FROM UserTypedText
WHERE userId = @userId
ORDER BY date
Где @userId
это передается в параметре.
Что означает «для каждого пользователя»? Я хочу сделать это по одному запросу, чтобы получить все данные в одной таблице. –
@ Мигран Овсепян - А если у вас 10 000 пользователей? – Oded
Я хочу отсортировать всех пользователей по заказу of thery Средняя скорость последних 10 гонок. Буду рад, если бы у меня было 10000 пользователей :) –
Для 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 для каждого пользователя в едином результирующем наборе, упорядоченном пользователем и датой.
Вы можете сделать это с объединением на пользовательском столе:
SELECT T.*
FROM Users AS U INNER JOIN (SELECT TOP 10 *
FROM UserTypedText as T
Where T.userID = U.userID
Order By date DESC)
Похожие старый вопрос: это то, что тебе нужно? http://stackoverflow.com/questions/176964/select-top-10-records-for-each-category – Rup