从具有相同 id 的一组值中选择最大值

Posted

技术标签:

【中文标题】从具有相同 id 的一组值中选择最大值【英文标题】:Select Max Value from a set of values with the same id 【发布时间】:2021-05-13 17:28:12 【问题描述】:

我有这两张表:

CREATE TABLE Category (

CategoryID int NOT NULL,
CategoryName varchar(255),

PRIMARY KEY (CategoryID)
);

CREATE TABLE Team (

CategoryID int NOT NULL,
TeamName varchar(255) NOT NULL,
Points int(255),

PRIMARY KEY (TeamName),
FOREIGN KEY (CategoryID) REFERENCES Category(CategoryID)
);

我想从每个类别中找出得分最高的球队。

到目前为止,我已经尝试过这些,我知道它们是错误的,但我走上了死胡同。任何建议都会有所帮助。

SELECT category.categoryid, team.teamname, MAX(team.points)
FROM category, team
GROUP BY team.teamname
HAVING MAX(team.points);


select category.categoryid, team.teamname
from category
right join team on team.categoryid = category.categoryid
group by team.teamname
having max(team.points);


select team.categoryid, team.teamname
from team, team a
having max(team.points);


select category.categoryid, team.teamname, max(team.points), team.points
from team
inner join category on category.categoryid = team.categoryid
group by teamname
having (select distinct max(team.points) from team);


select category.categoryid, team.teamname, team.points
from team
inner join category on category.categoryid = team.categoryid;

【问题讨论】:

RANK() OVER (PARTITION BY CategoryID ORDER BY Points DESC) rnk 在 CTE 中,WHERE rnk = 1 在外部查询中。 好吧int(50) @Akina 你能花点时间解释一下这是做什么的吗?我是 SQL 新手,我宁愿完全理解我在做什么,也不愿复制粘贴它 @RiggsFolly 是的,我知道,对不起! dev.mysql.com/doc/refman/8.0/en/… 和 dev.mysql.com/doc/refman/8.0/en/with.html 【参考方案1】:

我想从每个类别中找出得分最高的球队。

WITH cte AS ( SELECT *, RANK() OVER (PARTITION BY CategoryID ORDER BY Team.Points DESC) rnk
              FROM Category 
              NATURAL JOIN Team )
SELECT *
FROM cte
WHERE rnk = 1

但是如果一个类别中有超过一个团队具有相同的最高分,那么所有团队都将被退回。

如果在这种情况下您只需要其中一个,则需要额外的排序(并且它必须提供行唯一性)。例如,它可以是

WITH cte AS ( SELECT *, RANK() OVER (PARTITION BY CategoryID ORDER BY Team.Points DESC, Team.TeamName) rnk
              FROM Category 
              NATURAL JOIN Team )
SELECT *
FROM cte
WHERE rnk = 1;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5c73ac6a99e270535c70b173a65c02ff

当然,您可以只选择需要的列SELECT CategoryName, TeamName。

【讨论】:

【参考方案2】:

8.0 版支持dense_rank()

SELECT teamname
FROM (
    SELECT categoryid, teamname,
       dense_rank() over(partition by categoryid order by points desc) rnk
    FROM team
)t
WHERE rnk = 1
GROUP BY teamname
HAVING count(*) = (SELECT count(*) FROM Category);

【讨论】:

最终的 GROUP BY 和 HAVING 需要什么? dense_rank 已经做了所有事情.. @Akina - “每个类别的最高分。” 每个类别的哪一行被WHERE rnk = 1过滤? 当一个团队在一个类别中排名=1,而在另一个类别中排名=2,则它没有资格入选。所以rnk=1having count.. 都是必需的。 OP 需要:我想找到每个类别中得分最高的团队。 这不能是“在任何类别中得分最高的团队”(高概率没有这样的球队),所以它是“在至少一个类别中得分最高的球队”。 PS。将任务阅读为“我想从每个类别中找到(得分最多的团队)。”

以上是关于从具有相同 id 的一组值中选择最大值的主要内容,如果未能解决你的问题,请参考以下文章

C++ 在 Map 中的类的一组值中插入一个值

选择一列上的值在另一列上具有相同的一组值

确定一个值是不是在 Java 中的一组值中的最快方法是啥?

使用UISegmentedControl从一组或一组值中选择

仅从一组值中检索给定标识符和一个列值的多个条目中的行

如何对位于开始日期和结束日期之间的一组值求和?