mariadb SQL:在GROUP BY中使用特定值,用于具有多个值的行

rpppsulh  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(127)

以下背景:我有一个数据库,里面有我们NBA 2K在线联盟比赛中球员的单场比赛统计数据。因此,每个游戏的每个玩家都有一个条目。这些单场比赛的统计数据放在一起显示赛季平均水平。如果一个球员在一个赛季中为多支球队效力,理想情况下应该显示他在本赛季最后效力的球队,但对于我的查询,它可能会显示错误的球队。
表:gamestats_players行:playerID、gameID、赛季、日期、球队、积分(以及多个其他统计数据)
这是我使用的查询:

SELECT playerID, season, team, sum(pts) 
FROM gamestats_players
GROUP BY playerID, season
ORDER BY date desc

一名球员有2个进入A队,他第一次参加比赛,1个进入B队,他最近被交易到那里。查询结果仍然显示Team A,据我所知,如果在GROUP BY期间合并的行有多个值,则只选择一个随机值。我如何才能在小组中通过他为所显示的团队选择最新的条目而不仅仅是任何条目来实现这一点?
数据库条目:
Gamestats_玩家
| 游戏ID|玩家ID|团队介绍|季节|日期|点数|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 1|1|A组|三十六|2023-04-01 2023-04-01|10个|
| 二|1|A组|三十六|2023-04-02 2023-04-02|10个|
| 三|1|B队|三十六|2023-04-03 2023-04-03|10个|
查询结果
| 玩家ID|团队介绍|季节|和(点)|
| --------------|--------------|--------------|--------------|
| 1|A队 *|三十六|三十|

  • 应该是B队
wnavrhmk

wnavrhmk1#

首先,我们使用以下方法获取最新日期:

SELECT playerID, season, MAX(Date), sum(Points) as total_points
FROM gamestats_players
GROUP BY playerID, season

结果:

playerID    season  latestDate  total_points
1           36      2023-04-03  30

然后我们使用inner join将它与表连接,如下所示:

select distinct t.playerID, t.Team, t.season, s.total_points
from gamestats_players t
inner join (
  SELECT playerID, season, MAX(Date) as latestDate, sum(Points) as total_points
  FROM gamestats_players
  GROUP BY playerID, season
) as s on s.playerID = t.playerID and s.season = t.season and s.latestDate = t.Date

结果:

playerID    Team    season  total_points
1           Team B  36      30

Demo here

pjngdqdw

pjngdqdw2#

你可以使用窗口函数对每个球员在给定赛季的球队进行排名,然后进行聚合:

select playerid, 
    max(case when rn = 1 then team end) latest_team, 
    season, 
    sum(points) total_points
from (
    select g.*, 
        row_number() over(partition by playerid, season order by date desc) rn
    from gamestats_players g
) g
group by playerid, season

相关问题