2012-11-21 29 views
3

假設我們有兩個表:如何獲得第二個最好的價值

Players(player_id int) 
GameScores(player_id int, session_id int, score int) 

我們怎樣才能查詢第二高的得分會爲每一個球員?

例如,如果

Players 
1 
2 

GameScores 
(player_id, session_id, score) 
1 1 10 
1 2 20 
1 3 40 
2 4 10 
2 5 20 

Then result would be 
(player_id, session_id) 
1, 2 
2, 4 
+0

GameScores表有一個主鍵嗎?它叫什麼名字? –

+0

@LuisSiquot是的,它是session_id。 – Jofsey

+0

好吧,如果有兩個記錄具有相同的第一個分數,那麼查詢必須做的是:A)放棄這兩個記錄,B)將其中一個記錄爲第二個? –

回答

4

你能試試這個

 SELECT GameScores.player_id, GameScores.session_id 
    FROM (
     SELECT player_id,MAX(score) as SecondScore 
     FROM GameScores g 
     WHERE score < (SELECT Max(Score) FROM gameScore where gameScore.player_id = g.player_id) 
     GROUP BY player_id 
     ) x 
     INNER JOIN GameScores ON x.player_id = gamescore.player_id 
      AND x.SecondScore = gamescore.score 

這是選擇第二高的分數每個玩家查詢

SELECT player_id,MAX(score) as SecondScore 
      FROM GameScores g 
      WHERE score < (SELECT Max(Score) FROM gameScore where gameScore.player_id = g.player_id) 
      GROUP BY player_id 

你可以在此查詢中按會話分組。所以這就是爲什麼你需要把這個子查詢,並將其加入到gamescore得到session_id

+1

您可能會通過將MAX(Score)作爲Score進行別名來得到一個循環引用錯誤 - 至少我在測試查詢時在Access 2010中做過。 –

+0

不用多說了。謝謝 – Marc

+0

@lescott它工作嗎? – Marc

0

這裏的代碼片段的Oracle SQL

select tbl.player_id,tbl.session_id from 
(select p.player_id,g.session_id,g.score,rank() over (partition by p.player_id order by score desc) rnk from players p, 
gamescores g 
where p.player_id = g.player_id) tbl 
where tbl.rnk = 2; 
+0

在ms-access中不存在'over'和相關的 –

0
select player_id, first(session_id) as session_id 
from 
    GameScores inner join (
    select player_id, max(score) as secondscore 
    from 
     GameScores left join (
     select player_id, max(score) as firstscore 
     from GameScores 
     group by player_id 
    ) as NotThisOnes on GameScores.player_id = NotThisOnes.player_id 
        and GameScores.score = NotThisOnes.firstscore 
    where NotThisOnes.player_id is null 
    group by player_id 
) as thisare on GameScores.player_id = thisare.player_id 
      and GameScores.score  = thisare.secondscore 
group by player_id 
0

我採取不同的辦法......我我不確定這是否比其他答案更好,但我想這樣解決:

SELECT 
    GameScores.player_id, 
    GameScores.session_id, 
    GameScores.score 
FROM 
    GameScores 
WHERE 
    GameScores.score= 
    (select max(score) from GameScores GameScores_2 
    where GameScores.player_id = GameScores_2.Player_ID 
    and GameScores_2.Score< 
     (select max(score) from GameScores GameScores_1 
     where GameScores_1.player_id = GameScores.player_id));