Sql 选择某个日期的最大值记录

Sql 选择某个日期的最大值记录,sql,Sql,我有以下表格: 我需要选择球员在某个日期的所有球员的最大分数 例如,我需要玩家在2000-1-1之后获得的最高分数: 预期结果: 我尝试了以下选择: select * from player_score ps where ps.created_at >= '2000-1-1' and ps.score = (select max(ps2.score) from player_score ps2 where p

我有以下表格:

我需要选择球员在某个日期的所有球员的最大分数

例如,我需要玩家在2000-1-1之后获得的最高分数: 预期结果:

我尝试了以下选择:

select *
from player_score ps
where ps.created_at >= '2000-1-1' 
and ps.score = (select max(ps2.score) 
                  from player_score ps2 
                  where ps2.player_id = ps.player_id)
但它只返回一条记录:


你能告诉我实现我预期结果的最佳方法是什么吗?谢谢。

既然您想要每个玩家
max
,请按玩家id进行
分组

select ps.player_id, max(ps.score)
from player_score ps
where ps.created_at >= '2000-1-1' group by ps.player_id

由于您需要每个玩家
max
,请按玩家id进行
分组

select ps.player_id, max(ps.score)
from player_score ps
where ps.created_at >= '2000-1-1' group by ps.player_id

最大值始终为一个值,因此如果您需要更多值,请使用“按描述订购”
它将以从上到下的降序返回所有值,您可以在表格顶部看到最大值

最大值始终是一个值,因此如果需要更多值,请使用“按描述排序”
它将以从上到下的降序返回所有值,您可以在表格顶部看到关于@kritikagopalakrisnan答案的最大值,假设您需要结果集中的ID和CreatedDate列,您可以使用:

;with cte (player_id,MaxScore) as (
   select ps.player_id, max(ps.score) as MaxScore
   from player_score ps
   where ps.created_at >= '2000-1-1' 
   group by ps.player_id
)
select ps.*
from player_score ps
inner join cte on cte.player_id = ps.player_id and cte.MaxScore = ps.Score
where ps.created_at >= '2000-1-1'

关于@kritikagopalakrisnan的答案,假设您需要结果集中的ID和CreatedDate列,您可以使用:

;with cte (player_id,MaxScore) as (
   select ps.player_id, max(ps.score) as MaxScore
   from player_score ps
   where ps.created_at >= '2000-1-1' 
   group by ps.player_id
)
select ps.*
from player_score ps
inner join cte on cte.player_id = ps.player_id and cte.MaxScore = ps.Score
where ps.created_at >= '2000-1-1'

您还需要在子查询中按日期筛选:

select ps.*
from player_score ps
where ps.created_at >= '2000-01-01' 
and ps.score = (select max(ps2.score) 
                from player_score ps2 
                where ps2.created_at >= '2000-01-01' and
                      ps2.player_id = ps.player_id
               );
总的最大值出现在其他玩家的截止日期之前,这就是为什么没有行

如果您任意希望每个玩家都有一张记录,即使最高分数是平局,也要比较ID而不是分数:

select ps.*
from player_score ps
where ps.created_at >= '2000-01-01' 
and ps.id = (select ps2.id 
             from player_score ps2 
             where ps2.created_at >= '2000-01-01' and
                   ps2.player_id = ps.player_id
             order by ps2.score desc
             limit 1
            );
在Postgres中,最简单的解决方案是:

select distinct on (player_id) ps.*
from player_score ps
where ps.created_at >= '2000-01-01' 
order by player_id, score desc;

您还需要在子查询中按日期筛选:

select ps.*
from player_score ps
where ps.created_at >= '2000-01-01' 
and ps.score = (select max(ps2.score) 
                from player_score ps2 
                where ps2.created_at >= '2000-01-01' and
                      ps2.player_id = ps.player_id
               );
总的最大值出现在其他玩家的截止日期之前,这就是为什么没有行

如果您任意希望每个玩家都有一张记录,即使最高分数是平局,也要比较ID而不是分数:

select ps.*
from player_score ps
where ps.created_at >= '2000-01-01' 
and ps.id = (select ps2.id 
             from player_score ps2 
             where ps2.created_at >= '2000-01-01' and
                   ps2.player_id = ps.player_id
             order by ps2.score desc
             limit 1
            );
在Postgres中,最简单的解决方案是:

select distinct on (player_id) ps.*
from player_score ps
where ps.created_at >= '2000-01-01' 
order by player_id, score desc;

除了Gordon Linoff的解决方案外,您还可以使用
谓词中的
来解决它。
但是请确保将
GROUPBY
子句放在子查询中,而不是外部查询中

SELECT  id, 
        player_id,
        score,
        created_at 
FROM player_score ps2
WHERE ps2.score IN (SELECT MAX(score) FROM player_score ps
            WHERE created_at >= '2000-1-1'  AND ps.player_id = ps2.player_id
            GROUP BY ps.player_id)
ORDER BY player_id

除了Gordon Linoff的解决方案外,您还可以使用
谓词中的
来解决它。
但是请确保将
GROUPBY
子句放在子查询中,而不是外部查询中

SELECT  id, 
        player_id,
        score,
        created_at 
FROM player_score ps2
WHERE ps2.score IN (SELECT MAX(score) FROM player_score ps
            WHERE created_at >= '2000-1-1'  AND ps.player_id = ps2.player_id
            GROUP BY ps.player_id)
ORDER BY player_id


谢谢您的回复,但我只需要纯记录和它们的列。我无法在查询中显示最大值谢谢您的回复,但我只需要带列的纯记录。我无法在查询中显示最大值您所说的最大分数是什么意思?只有一名球员在2000-1-1之后得分最高。@Aoi选择更大的一名。如果id为的玩家在2000年的成绩为20分和30分,我应该记录为30分。请用您正在使用的数据库标记。@GordonLinoff postgres,但如果可能的话,我希望有一个通用查询。最大分数是什么意思?只有一名球员在2000-1-1之后得分最高。@Aoi选择更大的一名。如果id为的玩家在2000年的成绩为20分和30分,我应该记录为30分。请用您正在使用的数据库标记。@GordonLinoff postgres,但如果可能的话,我希望使用通用查询。我会一直使用此查询,直到我有两条成绩相同的记录:/distinct不可用works@DenisStephanov . . . 我不明白这个评论。你是说同一个玩家有两条记录吗?是的,当我为id为4的玩家添加下一条记录时,分数也为0,它返回的不是唯一的记录。对于Player4,我得到了两条值相同的记录。第二个解决方案给了我一个错误:一个用作expression@DenisStephanov . . . 它需要
限制1
。您好,这个查询一直工作到我有两个相同分数的记录:/distinct不起作用works@DenisStephanov . . . 我不明白这个评论。你是说同一个玩家有两条记录吗?是的,当我为id为4的玩家添加下一条记录时,分数也为0,它返回的不是唯一的记录。对于Player4,我得到了两条值相同的记录。第二个解决方案给了我一个错误:一个用作expression@DenisStephanov . . . 它需要
限制1