无法使用SQL Server编写查询

无法使用SQL Server编写查询,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我正在编写SQL Server数据库,其中有一个关系UserTypedTextuserId、date、textId和speed。哪个用户在键入哪个文本时的速度,其中userId、date是键。所以我想从这个表中查询每个用户最后10个按日期降序排序的行。若用户还并没有输入10条文本,那个么就获取有关其类型的所有信息。你能帮我解答这个问题吗?通过单个查询完成所有这些操作非常重要,以避免合并结果。我将编写一个存储过程,该过程将获取您感兴趣的用户的用户Id,并针对每个用户: SELECT TOP 10

我正在编写SQL Server数据库,其中有一个关系UserTypedTextuserId、date、textId和speed。哪个用户在键入哪个文本时的速度,其中userId、date是键。所以我想从这个表中查询每个用户最后10个按日期降序排序的行。若用户还并没有输入10条文本,那个么就获取有关其类型的所有信息。你能帮我解答这个问题吗?通过单个查询完成所有这些操作非常重要,以避免合并结果。

我将编写一个存储过程,该过程将获取您感兴趣的用户的用户Id,并针对每个用户:

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

其中@userId是传入的参数。

我将编写一个存储过程,该过程将获取您感兴趣的用户的用户Id,并针对每个用户:

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

其中@userId是传入的参数。

对于SQL Server 2005/2008,我们可以使用CTE和行号来获取所需的内容。。。这是未经测试的,但应该有效:

;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名,按用户和日期排序。

对于SQL Server 2005/2008,我们可以使用CTE和行号来获得我们想要的。。。这是未经测试的,但应该有效:

;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名,按用户和日期排序。

从SQL 2005及更高版本开始,您可以使用PARTITION by来执行此操作:

SELECT *
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Date DESC) AS RowNo, *
FROM UserTypedText
) x
WHERE x.RowNo <= 10

在SQL 2005及更高版本中,您可以使用with 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 T.*
FROM Users AS U INNER JOIN (SELECT TOP 10 *
                       FROM UserTypedText as T
                       Where T.userID = U.userID
                       Order By date DESC)

您可以通过用户表上的联接来执行此操作:

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

对每个用户来说意味着什么?我想通过一次查询来实现这一点,以获取一个表中的所有数据。@Mihran Hovsepyan-如果您有10000个用户,我想按照过去10场比赛的平均速度顺序对所有用户进行排序。如果我有10000个用户,我会很高兴:@Mihran Hovsepyan-我建议您编辑您的问题,并将其更改为最后一个要求。您应该能够在一次查询中获得最近10场比赛的平均值并按此排序。谢谢!很好的建议。但是已经没有什么问题了,我不想让它们在我改变后变得不正确。而且我已经得到了我想要的答案:对每个用户意味着什么?我想通过一次查询来实现这一点,以获取一个表中的所有数据。@Mihran Hovsepyan-如果您有10000个用户,我想按照过去10场比赛的平均速度顺序对所有用户进行排序。如果我有10000个用户,我会很高兴:@Mihran Hovsepyan-我建议您编辑您的问题,并将其更改为最后一个要求。您应该能够在一次查询中获得最近10场比赛的平均值并按此排序。谢谢!很好的建议。但是已经没有什么问题了,我不想让它们在我改变后变得不正确。而且我已经得到了我想要的答案:类似的老问题:这就是你想要的吗?类似的老问题:这就是你想要的吗?