You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:筛选Shaq为队内得分最高球队的SQL查询问题

找出Shaq为队内得分最高的球队

原始数据

+------+-----------+-------------+--------------+
| year | team_name | player_name | total_points |
+------+-----------+-------------+--------------+
| 1992 | Magic     | Shaq        | 2000         |
+------+-----------+-------------+--------------+
| 1992 | Magic     | Steve Kerr  | 4000         |
+------+-----------+-------------+--------------+
| 1996 | Lakers    | Shaq        | 2300         |
+------+-----------+-------------+--------------+
| 1996 | Lakers    | Magic       | 1000         |
+------+-----------+-------------+--------------+
| 2004 | Heat      | Shaq        | 3000         |
+------+-----------+-------------+--------------+

你的尝试问题分析

你写的查询存在两个问题:

  • 语法错误:FILTER(WHERE player_name = 'Shaq' 缺少闭合的右括号
  • 逻辑偏差:仅提取了Shaq的得分,但未将其与队内其他球员的最高得分做对比,无法判断他是否是队内得分最高的球员

正确解法

方法一:窗口函数排序筛选

利用RANK()窗口函数按年份+球队分组,对组内得分降序排序,再筛选Shaq排名第一的记录:

SELECT year, team_name, player_name, total_points
FROM (
    SELECT 
        *,
        RANK() OVER (PARTITION BY year, team_name ORDER BY total_points DESC) AS score_rank
    FROM basketball
) ranked_data
WHERE player_name = 'Shaq' AND score_rank = 1;

方法二:子查询计算队内最高分

先统计每个球队每年的最高得分,再关联原表筛选出Shaq得分等于该最高分的记录:

SELECT b.year, b.team_name, b.player_name, b.total_points
FROM basketball b
INNER JOIN (
    SELECT year, team_name, MAX(total_points) AS max_team_points
    FROM basketball
    GROUP BY year, team_name
) team_score ON b.year = team_score.year 
             AND b.team_name = team_score.team_name
             AND b.total_points = team_score.max_team_points
WHERE b.player_name = 'Shaq';

两种方法都能得到目标结果:1996年湖人队、2004年热火队的Shaq记录。

内容的提问来源于stack exchange,提问作者spotty23544332

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:10:35