PostgreSQL - Select 多个最大计数
PostgreSQL - Select multiple max counts
我正在使用 PostgreSQL。
我有一个 table 的竞争对手,其中包含有关电子竞技游戏中竞争对手的信息。 table 包含游戏 ID、参赛者的昵称和所玩角色的名字 he/she。
我想select每个昵称和他们玩得最多的角色。
例如,如果竞争对手 Faker 玩过角色 Ryze 4 次和 Lulu 3 次,我希望 Faker Ryze 4 在输出中。
这是我目前拥有的:
select nick, character, count(*) as played
from competitor
group by nick, character
order by nick;
但是我在输出中得到了 Faker Ryze 4 和 Faker Lulu 3。
我试过 max() 和嵌套,但我无法弄清楚。
你正在使用最大和嵌套走正确的路线,我稍微修改了给定的答案 here:
select t1.nick, t1.character, t1.count
from (
select nick, character, count(*) as played
from competitor
group by nick, character
) t1
inner join
(
select nick, max(played) max_count
from
(
select nick, character, count(*) as played
from competitor
group by nick, character
)
group by nick
) t2
on t1.nick = t2.nick
and t1.count = t2.max_count
如果您为基本查询创建了一个视图,这可能更容易阅读:
名为 PlayerCount 的视图:
select nick, character, count(*) as played
from competitor
group by nick, character
SQL 查询现在是:
select t1.nick, t1.character, t1.count
from PlayerCount t1
inner join
(
select nick, max(played) max_count
from PlayerCount
group by nick
) t2
on t1.nick = t2.nick
and t1.count = t2.max_count
这样就可以了。
SELECT nick, character,played
FROM
(SELECT s1.*,
row_number() OVER (PARTITION BY nick
ORDER BY played DESC) AS row1
FROM
(SELECT nick, character, COUNT(*) AS played
FROM competitor
GROUP BY nick, character
ORDER BY nick,
COUNT(*) DESC) s1)s2
WHERE row1=1;
查询 100% 正确。 SQL Fiddle here。此外,它是唯一可以轻松支持同一昵称的查询(通过将 row_number()
更改为 rank()
)并避免不必要的 JOIN
.
试试这个:
with counts as (
select nick, character, count(*) cnt, max(sometimestamp) hora
from competitor
group by nick, character
order by nick, cnt desc, hora
)
select nick, character, max(cnt)
from counts c1 where nick
in (select nick from counts where nick = c1.nick limit 1)
and character in (select character from counts where nick = c1.nick limit 1)
group by nick, character
order by nick
max(sometimestamp) hora
将成为决胜局,您将不得不适应。或者,如果您不关心关系,只需删除此字段。此查询将为您提供每个昵称的字符,计数较大,如果平局,它将 return 第一个达到最大计数。
我正在使用 PostgreSQL。
我有一个 table 的竞争对手,其中包含有关电子竞技游戏中竞争对手的信息。 table 包含游戏 ID、参赛者的昵称和所玩角色的名字 he/she。
我想select每个昵称和他们玩得最多的角色。
例如,如果竞争对手 Faker 玩过角色 Ryze 4 次和 Lulu 3 次,我希望 Faker Ryze 4 在输出中。
这是我目前拥有的:
select nick, character, count(*) as played
from competitor
group by nick, character
order by nick;
但是我在输出中得到了 Faker Ryze 4 和 Faker Lulu 3。
我试过 max() 和嵌套,但我无法弄清楚。
你正在使用最大和嵌套走正确的路线,我稍微修改了给定的答案 here:
select t1.nick, t1.character, t1.count
from (
select nick, character, count(*) as played
from competitor
group by nick, character
) t1
inner join
(
select nick, max(played) max_count
from
(
select nick, character, count(*) as played
from competitor
group by nick, character
)
group by nick
) t2
on t1.nick = t2.nick
and t1.count = t2.max_count
如果您为基本查询创建了一个视图,这可能更容易阅读:
名为 PlayerCount 的视图:
select nick, character, count(*) as played
from competitor
group by nick, character
SQL 查询现在是:
select t1.nick, t1.character, t1.count
from PlayerCount t1
inner join
(
select nick, max(played) max_count
from PlayerCount
group by nick
) t2
on t1.nick = t2.nick
and t1.count = t2.max_count
这样就可以了。
SELECT nick, character,played
FROM
(SELECT s1.*,
row_number() OVER (PARTITION BY nick
ORDER BY played DESC) AS row1
FROM
(SELECT nick, character, COUNT(*) AS played
FROM competitor
GROUP BY nick, character
ORDER BY nick,
COUNT(*) DESC) s1)s2
WHERE row1=1;
查询 100% 正确。 SQL Fiddle here。此外,它是唯一可以轻松支持同一昵称的查询(通过将 row_number()
更改为 rank()
)并避免不必要的 JOIN
.
试试这个:
with counts as (
select nick, character, count(*) cnt, max(sometimestamp) hora
from competitor
group by nick, character
order by nick, cnt desc, hora
)
select nick, character, max(cnt)
from counts c1 where nick
in (select nick from counts where nick = c1.nick limit 1)
and character in (select character from counts where nick = c1.nick limit 1)
group by nick, character
order by nick
max(sometimestamp) hora
将成为决胜局,您将不得不适应。或者,如果您不关心关系,只需删除此字段。此查询将为您提供每个昵称的字符,计数较大,如果平局,它将 return 第一个达到最大计数。