我正在编写SQL Server数据库,其中我有一个关系UserTypedText(userId,date,textId,speed)。 (哪个用户在哪种类型的文本以哪种速度)其中(userId,date)是关键。所以我想从这个表中查询每个用户的最后10行(按日期递减顺序排序)行。如果用户没有输入10个文本,则获取有关其类型的所有信息。你能帮我解决这个问题吗?通过单个查询完成所有这些非常重要,而不是UNION结果结果。
答案 0 :(得分: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名,按用户和日期排序。
答案 1 :(得分:2)
从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
答案 2 :(得分:1)
我会写一个存储过程,它将获取您感兴趣的用户的用户ID,以及每个用户:
SELECT TOP 10 *
FROM UserTypedText
WHERE userId = @userId
ORDER BY date
其中@userId
是传入的参数。
答案 3 :(得分: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)