2010-10-28 44 views
0

我已经看过类似于StackOverflow询问的其他多个问题,但似乎没有任何东西符合我的账单。我的查询稍微复杂一些。基本上,我需要找到条目的等级。根据游戏结果返回rank的SQL Server查询

我的表结构是:

的TestEntry

Id, TotalTime, DateCreated 

GameResult

GameId, TestEntryId, Duration, Score 

QuestionResult

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”,它正在被动态计算。

+2

什么版本的SQL Server? – 2010-10-28 02:17:43

+0

我第二个OMG Ponies的问题,因为SS08中有一个RANK函数。 – 2010-10-28 02:21:24

+2

@Brian Driscoll:SS2005是第一个支持分析功能的人 - 我同意这一点,这就是我所看到的。 – 2010-10-28 02:23:35

回答

2

除非临时表需要临时表,否则就解决它们并使用公用表表达式。然后使用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 
+0

可能可以归结为几个更少的查询,但我很早就睡觉,不能打扰;) – spender 2010-10-28 02:28:51

+0

作品一种享受!注意到如果我用一个entryid进行过滤,它总是返回1的秩。通过将最后一个选择放入WITH中,然后查询,即SELECT ID,Score,[Rank] FROM GRR WHERE Id =' ',我获得了单个测试条目的正确等级。 – mickyjtwin 2010-10-28 04:30:23