Sql 选择某个日期的最大值记录
我有以下表格: 我需要选择球员在某个日期的所有球员的最大分数 例如,我需要玩家在2000-1-1之后获得的最高分数: 预期结果: 我尝试了以下选择: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
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
。