Не могу написать запрос с использованием SQL Server - PullRequest
0 голосов
/ 19 декабря 2010

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

Ответы [ 4 ]

3 голосов
/ 19 декабря 2010

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

2 голосов
/ 19 декабря 2010

В SQL 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 голос
/ 19 декабря 2010

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

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

Где @userId - переданный параметр.

0 голосов
/ 19 декабря 2010

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

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