Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于游戏结果返回排名的SQL Server查询_Sql_Sql Server_Tsql - Fatal编程技术网

基于游戏结果返回排名的SQL Server查询

基于游戏结果返回排名的SQL Server查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我已经看了很多关于StackOverflow的类似问题,但似乎没有什么符合我的要求。我的问题稍微复杂一点。基本上,我需要找到条目的排名 我的表格结构是: TestEntry Id, TotalTime, DateCreated 游戏结果 GameId, TestEntryId, Duration, Score QuestionId, TestEntryId, Correct, UsersAnswer 问题结果 GameId, TestEntryId, Duration, Score Qu

我已经看了很多关于StackOverflow的类似问题,但似乎没有什么符合我的要求。我的问题稍微复杂一点。基本上,我需要找到条目的排名

我的表格结构是:

TestEntry

Id, TotalTime, DateCreated
游戏结果

GameId, TestEntryId, Duration, Score
QuestionId, TestEntryId, Correct, UsersAnswer
问题结果

GameId, TestEntryId, Duration, Score
QuestionId, TestEntryId, Correct, UsersAnswer
计算所有分数的查询通过以下方式完成:

CREATE TABLE #GRS
(
TestEntryId uniqueidentifier,
Score int
)

CREATE TABLE #QRS
(
    TestEntryId uniqueidentifier,
    CorrectAnswers int
)
/* Populate temp tables with Game/Question results */
INSERT INTO #GRS
SELECT 
        TestEntryId, 
        SUM(Score) AS Score 
    FROM GameResult
    GROUP BY TestEntryId

INSERT INTO #QRS
SELECT 
        TestEntryId, 
        COUNT(*) CorrectAnswers
    FROM QuestionResult
    WHERE Correct = 1
    GROUP BY TestEntryId

SELECT 
        Id, ISNULL(GRS.Score,0) + (ISNULL(QRS.CorrectAnswers,0) * 25) AS Score
    FROM TestEntry TE
    LEFT JOIN #GRS GRS ON(GRS.TestEntryId = TE.Id)
    LEFT JOIN #QRS QRS ON(QRS.TestEntryId = TE.Id)
    WHERE TE.TotalTime > 0

根据特定的TestEntry.Id,我需要确定该条目的排名。由于临时表的使用,以及TestEntry表中没有“TotalScore”这一事实,它被动态计算。除非迫切需要临时表,否则请取消临时表并使用通用表表达式。然后使用RANK函数获得每个id的排名

;WITH GRS AS
(
    SELECT 
        TestEntryId, 
        SUM(Score) AS Score 
    FROM GameResult
    GROUP BY TestEntryId
),
QRS AS
(
SELECT 
        TestEntryId, 
        COUNT(*) CorrectAnswers
    FROM QuestionResult
    WHERE Correct = 1
    GROUP BY TestEntryId
),
Scores AS
(
SELECT 
        Id, ISNULL(GRS.Score,0) + (ISNULL(QRS.CorrectAnswers,0) * 25) AS Score
    FROM TestEntry TE
    LEFT JOIN GRS ON(GRS.TestEntryId = TE.Id)
    LEFT JOIN QRS ON(QRS.TestEntryId = TE.Id)
    WHERE TE.TotalTime > 0
)
SELECT Id,Score,RANK() OVER (ORDER BY Score DESC) AS [Rank] FROM Scores

除非迫切需要临时表,否则可以将它们打包并使用公共表表达式。然后使用RANK函数获得每个id的排名

;WITH GRS AS
(
    SELECT 
        TestEntryId, 
        SUM(Score) AS Score 
    FROM GameResult
    GROUP BY TestEntryId
),
QRS AS
(
SELECT 
        TestEntryId, 
        COUNT(*) CorrectAnswers
    FROM QuestionResult
    WHERE Correct = 1
    GROUP BY TestEntryId
),
Scores AS
(
SELECT 
        Id, ISNULL(GRS.Score,0) + (ISNULL(QRS.CorrectAnswers,0) * 25) AS Score
    FROM TestEntry TE
    LEFT JOIN GRS ON(GRS.TestEntryId = TE.Id)
    LEFT JOIN QRS ON(QRS.TestEntryId = TE.Id)
    WHERE TE.TotalTime > 0
)
SELECT Id,Score,RANK() OVER (ORDER BY Score DESC) AS [Rank] FROM Scores

我支持OMG Ponies的问题,因为SS08中有一个秩函数。@Brian Driscoll:SS2005是第一个支持分析函数的人,我同意,这是我将考虑使用的。@OMG Ponies-感谢我没有意识到它在SS2005中得到支持的提示。是2008年,但很高兴知道在2005年支持它!我支持OMG Ponies的问题,因为SS08中有一个秩函数。@Brian Driscoll:SS2005是第一个支持分析函数的人,我同意,这是我将考虑使用的。@OMG Ponies-感谢我没有意识到它在SS2005中得到支持的提示。是2008年,但很高兴知道在2005年支持它!也许可以归结为少问几个问题,但我早该上床睡觉了,不能再烦了;)真是一种享受!注意,如果我然后按entryid过滤,它总是返回一个秩1。通过将最后一个选择也放入WITH中,然后对其进行查询,即从GRR中选择Id,Score,[Rank],其中Id='',我获得了单个测试条目的正确排名。可能可以归结为少一些查询,但我早就该上床睡觉了,不必担心;)真是一种享受!注意,如果我然后按entryid过滤,它总是返回一个秩1。通过将最后一个选择也放入WITH中,然后对其进行查询,即从GRR中选择Id,Score,[Rank],其中Id='',我获得了单个测试条目的正确排名。