Select 具有相同 ID 的一组值中的最大值
Select Max Value from a set of values with the same id
我有这两个表:
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;
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);
I want to find the team with the most points from every category.
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 只需要列<即 SELECT CategoryName, TeamName
。
我有这两个表:
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;
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);
I want to find the team with the most points from every category.
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 只需要列<即 SELECT CategoryName, TeamName
。