Select 只有 SQL 关系中的最大值?
Select only largest values in a SQL relation?
我有以下两个关系:
Game(id, name, year)
Devs(pid, gid, role)
其中 Game.id 是主键,Devs.gid 是 Game.id 的外键。
我想编写一个 SQL 查询来查找参与该游戏的人数最多的游戏。我写了以下查询:
SELECT Game.name, count(DISTINCT Devs.pid)
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY count(Devs.pid) DESC;
这个查询有点实现了我的目标,因为它 return 关系中的所有游戏都按参与每个游戏的人数排序,但我正在尝试修改这个查询,以便它做两件事。第一,它应该只 return 开发它的人最多的游戏,第二,如果有两个游戏的开发人数相等,它应该 return 两个游戏。我知道如果我像这样替换顶行:
SELECT TOP 1 Game.name, count(DISTINCT Devs.pid)
那么它就实现了我的第一个目标,但是如果有两款游戏的开发人数最多,那么它只是其中一款游戏 return。我该如何更改此查询,使其 return 所有参与人数最多的游戏?
任务可以缩短为:
Give me all the rows from the original query with the maximum number of developers
可以通过WITH
statement到达。答案如下:
WITH GamesDevs (GameName, DevsCount)
AS
(
SELECT Game.name AS GameName, count(DISTINCT Devs.pid) AS DevsCount
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY count(Devs.pid) DESC
)
SELECT * FROM GamesDevs WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM GamesDevs)
希望对您有所帮助。
试试这个查询:
select g.name, count(d.gid)
from
game g
join
devs d
on g.id=d.gid
group by g.name
having count(d.gid)= (select max (temp.cnt) from
(select gid p, count(*) cnt
from devs
group by gid) temp)
;
只需使用 with ties
语法,如果这是唯一不起作用的语法:
https://msdn.microsoft.com/en-us/library/ms189463.aspx
select top 1 with ties
game.name,
count(distinct devs.pid)
from game
join devs
on devs.gid = game.id
group by devs.gid,
game.name
order by 3 desc
还要考虑现代连接语法。
这也应该有效:)
SELECT Game.name, count(DISTINCT Devs.pid)
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
Having count(DISTINCT Devs.pid) = Max(count(DISTINCT Devs.pid))
ORDER BY count(Devs.pid) DESC;
我有以下两个关系:
Game(id, name, year)
Devs(pid, gid, role)
其中 Game.id 是主键,Devs.gid 是 Game.id 的外键。
我想编写一个 SQL 查询来查找参与该游戏的人数最多的游戏。我写了以下查询:
SELECT Game.name, count(DISTINCT Devs.pid)
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY count(Devs.pid) DESC;
这个查询有点实现了我的目标,因为它 return 关系中的所有游戏都按参与每个游戏的人数排序,但我正在尝试修改这个查询,以便它做两件事。第一,它应该只 return 开发它的人最多的游戏,第二,如果有两个游戏的开发人数相等,它应该 return 两个游戏。我知道如果我像这样替换顶行:
SELECT TOP 1 Game.name, count(DISTINCT Devs.pid)
那么它就实现了我的第一个目标,但是如果有两款游戏的开发人数最多,那么它只是其中一款游戏 return。我该如何更改此查询,使其 return 所有参与人数最多的游戏?
任务可以缩短为:
Give me all the rows from the original query with the maximum number of developers
可以通过WITH
statement到达。答案如下:
WITH GamesDevs (GameName, DevsCount)
AS
(
SELECT Game.name AS GameName, count(DISTINCT Devs.pid) AS DevsCount
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY count(Devs.pid) DESC
)
SELECT * FROM GamesDevs WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM GamesDevs)
希望对您有所帮助。
试试这个查询:
select g.name, count(d.gid)
from
game g
join
devs d
on g.id=d.gid
group by g.name
having count(d.gid)= (select max (temp.cnt) from
(select gid p, count(*) cnt
from devs
group by gid) temp)
;
只需使用 with ties
语法,如果这是唯一不起作用的语法:
https://msdn.microsoft.com/en-us/library/ms189463.aspx
select top 1 with ties
game.name,
count(distinct devs.pid)
from game
join devs
on devs.gid = game.id
group by devs.gid,
game.name
order by 3 desc
还要考虑现代连接语法。
这也应该有效:)
SELECT Game.name, count(DISTINCT Devs.pid)
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
Having count(DISTINCT Devs.pid) = Max(count(DISTINCT Devs.pid))
ORDER BY count(Devs.pid) DESC;