查询Tom最高score游戏中唯一的posX与posY数据(多列去重+MAX值)
SQL查询需求:获取Tom的唯一posX和posY数据(对应最高score的游戏)
现有数据表结构及数据
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 |
查询需求
编写SQL查询,获取Tom的所有唯一posX和posY数据,且这些数据所属游戏的score为Tom的最高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 |
解决方案
以下是满足需求的SQL查询语句:
SELECT gd.* FROM GAME_DETAILS gd JOIN GAMES g ON gd.gameId = g.gameId WHERE g.name = 'Tom' AND (gd.posX, gd.posY) NOT IN ( SELECT gd2.posX, gd2.posY FROM GAME_DETAILS gd2 JOIN GAMES g2 ON gd2.gameId = g2.gameId WHERE g2.name = 'Tom' AND g2.score < (SELECT MAX(score) FROM GAMES WHERE name = 'Tom') ) ORDER BY gd.gameDetailIds;
语句说明
- 子查询先获取Tom的最高score值;
- 排除那些在非最高score游戏中出现过的
(posX, posY)组合; - 最终保留的是仅在最高score游戏中出现,或在非最高score游戏中从未出现过的唯一
(posX, posY)对应的所有详情记录。
内容的提问来源于stack exchange,提问作者Hữu Trí Nguyễn
相关产品推荐
相关产品推荐

