我的資料庫中有一個QuizAttempt表,如下所示
| QAID | QID | UID | Score | Time |
| ---- | -- -- | ----- |
| 1 | 5 | 3 | 119 | 105 |
| 2 | 5 | 3 | 117 | 70 |
| 3 | 5 | 3 | 119 | 90 |
| 4 | 5 | 4 | 120 | 130 |
其中QAID=測驗嘗試ID,QID=測驗ID,UID=用戶ID,Score=該嘗試的分數,Time=所花費的時間(秒)
我想根據分數從高到低獲得用戶排名;如果分數相同,則時間從高到低。此外,我還必須將那些已經參加過一次以上測驗的用戶分組,并顯示他們的最佳嘗試。
因此,結果應該是這樣的(分組的UID 3)
| QAID | QID | UID | Score | Time |
| ---- | -- -- | ----- |
| 4 | 5 | 4 | 120 | 130 |
| 3 | 5 | 3 | 119 | 90 |
我知道我可以應用Group By UID,然后應用Max(Score),但另外我還必須針對該記錄選擇時間,但我是否要在GROUP BY中拾取119旁邊的最小分數?
因為如果我寫
Select QID, UID, Max(Score) as Topper。Min(Time) as MinTime from QuizAttempt
Group By QID, UID
Order By Topper DESC
我得到這個
| QID | UID | Topper | MinTime |
| -- |-- | ------ | ------- |
| 5 | 4 | 120 | 130 |
| 5 | 3 | 119 | 70 |
我得到70,這是整體的最小時間,屬于得分117
的記錄。而如果我嘗試這樣做
選擇QID, UID, Max(Score) 作為Topper。Min(Time) as MinTime from QuizAttempt
Group By QID, UID, Score
Order By Topper DESC
我得到
| QID | UID | Topper | MinTime |
| -- |-- | ------ | ------- |
| 5 | 4 | 120 | 130 |
| 5 | 3 | 119 | 90 |
| 5 | 3 | 117 | 70 |
我應該如何正確地進行分組?我使用的是MS SQL Management Studio 2008
。uj5u.com熱心網友回復:
你可以使用row_number():
select qa.*
from (select qa.*,
row_number() over (partition by uid order by score desc, time asc) as seqnum
from QuizAttempt qa
) qa
where seqnum = 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314836.html
標籤:
