创建MS SQL Server查询以确定排名

创建MS SQL Server查询以确定排名,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在创建一个应用程序,用户可以在其中进行训练。他们通过应用程序传递结果,这些结果存储在SQL Server数据库中。结果以这种方式保存在SQL Server表中: 我想写一个查询,根据每个用户的最佳分数创建排名。这就是我迄今为止所拥有的,多亏了这一点: 这将生成以下内容,其中根据用户的最佳分数创建排名: 当某个用户提交新的训练时,我想根据上次提交的训练检查他的排名,并与其他用户的最佳表现进行比较。所以假设用户_id 2添加了一个新的训练,他的分数是,比如说,12,那么基于这个新的表现,他目前的

我正在创建一个应用程序,用户可以在其中进行训练。他们通过应用程序传递结果,这些结果存储在SQL Server数据库中。结果以这种方式保存在SQL Server表中:

我想写一个查询,根据每个用户的最佳分数创建排名。这就是我迄今为止所拥有的,多亏了这一点:

这将生成以下内容,其中根据用户的最佳分数创建排名:

当某个用户提交新的训练时,我想根据上次提交的训练检查他的排名,并与其他用户的最佳表现进行比较。所以假设用户_id 2添加了一个新的训练,他的分数是,比如说,12,那么基于这个新的表现,他目前的排名是多少?如果是那样的话,他在这张桌子上排名第二。谢谢。

试试这个:

DECLARE @CurrentUser INT = 5;

WITH DataSource AS
(
    SELECT id, 
           workout_id, 
           level_id, 
           user_id, 
           total_time, 
           score, 
           datetime_added,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score DESC, datetime_added DESC) rowID
    FROM nodefit_rankings_fitness 
    WHERE user_id <> @CurrentUser
    UNION ALL
    SELECT id, 
           workout_id, 
           level_id, 
           user_id, 
           total_time, 
           score, 
           datetime_added,
           ROW_NUMBER() OVER (ORDER BY datetime_added DESC) rowID
    FROM nodefit_rankings_fitness 
    WHERE user_id = @CurrentUser

)
SELECT *
      ,ROW_NUMBER() OVER (ORDER BY score DESC) AS RankID
FROM DataSource
WHERE rowID = 1
ORDER BY RankID
DECLARE @CurrentUser INT = 5;

WITH DataSource AS
(
    SELECT id, 
           workout_id, 
           level_id, 
           user_id, 
           total_time, 
           score, 
           datetime_added,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score DESC, datetime_added DESC) rowID
    FROM nodefit_rankings_fitness 
    WHERE user_id <> @CurrentUser
    UNION ALL
    SELECT id, 
           workout_id, 
           level_id, 
           user_id, 
           total_time, 
           score, 
           datetime_added,
           ROW_NUMBER() OVER (ORDER BY datetime_added DESC) rowID
    FROM nodefit_rankings_fitness 
    WHERE user_id = @CurrentUser

)
SELECT *
      ,ROW_NUMBER() OVER (ORDER BY score DESC) AS RankID
FROM DataSource
WHERE rowID = 1
ORDER BY RankID