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 4Faker 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 第一个达到最大计数。