0

I have a list of results of player's scores in games, and I need to get the first two finishers for each game. LIMIT 2 works for the result set as a whole, but I need to limit it to 2 (or 1 if there is only one) per game.

Table being queried:

game_id player_id score
1 10 100
1 20 300
1 30 200
2 40 100
2 50 200

Desired results:

game_id player_id score
1 20 300
1 30 200
2 50 200
2 40 100
Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360
Old Man
  • 3,295
  • 5
  • 23
  • 22

1 Answers1

1

Using RANK() we can try:

WITH cte AS (
    SELECT *, RANK() OVER (PARTITION BY game_id ORDER BY score DESC) rnk
    FROM yourTable
)

SELECT game_id, player_id, score
FROM cte
WHERE rnk <= 2
ORDER BY game_id, score DESC;

Note that if there be the possibility of ties, then you might want to use DENSE_RANK instead of RANK. If ties are not a concern, then you could also use ROW_NUMBER instead of RANK.

Tim Biegeleisen
  • 502,043
  • 27
  • 286
  • 360