2010-10-28 42 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