无法使用SQL Server编写查询

时间:2010-12-19 19:55:04

标签: sql sql-server greatest-n-per-group

我正在编写SQL Server数据库,其中我有一个关系UserTypedText(userId,date,textId,speed)。 (哪个用户在哪种类型的文本以哪种速度)其中(userId,date)是关键。所以我想从这个表中查询每个用户的最后10行(按日期递减顺序排序)行。如果用户没有输入10个文本,则获取有关其类型的所有信息。你能帮我解决这个问题吗?通过单个查询完成所有这些非常重要,而不是UNION结果结果。

4 个答案:

答案 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)
相关问题