2015-10-21 37 views
0

我正在使用PostgreSQL。
我有一个表竞争对手的信息关于竞争对手在电子竞技游戏。该表包含游戏ID,竞争对手的昵称和他/她扮演的角色的名字。PostgreSQL - 选择多个最大计数

我想选择每个昵称和他们发挥最多的角色。
例如,如果参赛选手Faker已经4次出场角色Ryze和3次出场,我希望Faker Ryze 4在输出中。

这是我到目前为止有:

select nick, character, count(*) as played 
from competitor 
group by nick, character 
order by nick; 

但后来我在输出中获得两个法克尔雷兹4法克尔露露3
我试过max()和嵌套,但我无法弄清楚。

回答

1

试试这个:

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将是决胜局,你必须去适应。或者,如果你不关心领带,只要删除这个领域。这个查询会给你每个昵称的字符,数字越大,如果是平局,它将返回第一个数字以达到最大数量。

+0

非常感谢。这工作完美! 我甚至不知道** WITH **语句。 –

+0

下来的选民照顾解释? – CFreitas

0

您正在下降,最大和筑巢正确的路线,我稍微修改给出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 
+0

我得到这个错误: _ERROR:聚合函数不允许在JOIN条件 第15行:和t1.count = t2.max_count; _ –

+0

而我只是得到更多的错误,当我尝试修复它。 –

+0

嗯对不起,我留下了我测试它的虚拟表的名字,我现在修改了它。 –

3

这会做到这一点。

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小提琴here。此外,它是唯一可以轻松支持同一个昵称的联系人(通过更改row_number()rank())并避免不必要的JOIN

+0

这将导致所有计数。你计算最​​大的尼克和字符女巫已经是独特的嵌套选择后。 – CFreitas

+0

恐怕不是。这与我之前的查询完全一样。 –

+0

@MartinJohansen修复了它。 – Alexandros