Table GAMES
gameId | name | score |
---|---|---|
1 | Tom | 452 |
2 | Tom | 453 |
Table GAME_DETAILS
gameDetailIds | gameId | posX | posY | time |
---|---|---|---|---|
1 | 1 | -1 | -1 | 1665264019 |
2 | 1 | -1 | 0 | 1665264020 |
3 | 1 | -1 | 1 | 1665264021 |
4 | 1 | 0 | -1 | 1665264022 |
5 | 1 | 0 | 0 | 1665264023 |
6 | 2 | -1 | -1 | 1665264024 |
7 | 2 | -1 | 0 | 1665264025 |
8 | 2 | -1 | 1 | 1665264026 |
I want to find all of Tom's posX and posY where posX and posY are unique and it belongs to the game with the highest score
gameDetailIds | gameId | posX | posY | time |
---|---|---|---|---|
4 | 1 | 0 | -1 | 1665264022 |
5 | 1 | 0 | 0 | 1665264023 |
6 | 2 | -1 | -1 | 1665264024 |
7 | 2 | -1 | 0 | 1665264025 |
8 | 2 | -1 | 1 | 1665264026 |
Thank you very much!
CodePudding user response:
As I understand it, you want to show all distinct postions, but per position you want to show the "best" row. "Best" means the game with the highest score for that position.
You can use ROW_NUMBER
to mark these best rows with #1. Then keep only those rows.
select gamedetailids, gameid, posx, posy, time
from
(
select
gameid, gd.gamedetailids, gd.posx, gd.posy, gd.time,
row_number() over (partition by gd.posx, gd.posy order by g.score desc, gd.time) as rn
from game_details gd
join game g using (gameid)
where g.name = 'Tom'
) ranked
order by posx, posy;