基于游戏结果返回排名的SQL Server查询
我已经看了很多关于StackOverflow的类似问题,但似乎没有什么符合我的要求。我的问题稍微复杂一点。基本上,我需要找到条目的排名 我的表格结构是: TestEntry基于游戏结果返回排名的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
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='',我获得了单个测试条目的正确排名。