2010-12-19 1 views
0

Я пишу базу данных SQL Server, где у меня есть отношение UserTypedText (userId, date, textId, speed). (какой пользователь использует типы, текст которых зависит от скорости) Где (userId, date) является ключом. Поэтому я хочу запросить из этой таблицы последние 10 (отсортированные по дате по убыванию) строки для каждого пользователя. Если пользователь не набрал 10 текстов, то получите всю информацию о его типах. Не могли бы вы помочь мне с этим вопросом? Очень важно делать все это с помощью одного запроса, а не результатов результатов UNION.Не удается написать запрос с использованием SQL Server

+0

Похожие старый вопрос: это то, что тебе нужно? http://stackoverflow.com/questions/176964/select-top-10-records-for-each-category – Rup

ответ

2

С 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 
1

Я хотел бы написать хранимую процедуру, которая будет принимать пользовательский идентификатор пользователя, которого вы заинтересованы, и для каждого пользователя:

SELECT TOP 10 * 
FROM UserTypedText 
WHERE userId = @userId 
ORDER BY date 

Где @userId это передается в параметре.

+0

Что означает «для каждого пользователя»? Я хочу сделать это по одному запросу, чтобы получить все данные в одной таблице. –

+0

@ Мигран Овсепян - А если у вас 10 000 пользователей? – Oded

+0

Я хочу отсортировать всех пользователей по заказу of thery Средняя скорость последних 10 гонок. Буду рад, если бы у меня было 10000 пользователей :) –

3

Для 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 для каждого пользователя в едином результирующем наборе, упорядоченном пользователем и датой.

0

Вы можете сделать это с объединением на пользовательском столе:

SELECT T.* 
FROM Users AS U INNER JOIN (SELECT TOP 10 * 
         FROM UserTypedText as T 
         Where T.userID = U.userID 
         Order By date DESC)