Sql 如何使用字段获取所有最大计数

Sql 如何使用字段获取所有最大计数,sql,postgresql,Sql,Postgresql,我试图返回表中最大条目数的名称,并返回最大个目数的名称、计数元组列表。我当前的解决方案使用: select name, count(*) from action_log group by name order by count desc limit 1; 问题在于,使用“限制1”不能解释多个具有最大计数值的名称 如何确定最大计数,然后获取所有匹配的名称?我想,但显然不能这样做: select name, max(count(*)) from action_log group by name;

我试图返回表中最大条目数的名称,并返回最大个目数的名称、计数元组列表。我当前的解决方案使用:

select name, count(*)
from action_log
group by name
order by count desc
limit 1;
问题在于,使用“限制1”不能解释多个具有最大计数值的名称

如何确定最大计数,然后获取所有匹配的名称?我想,但显然不能这样做:

select name, max(count(*))
from action_log
group by name;
试试这个:

select name, COUNT(*)
from action_log
group by name
HAVING COUNT(*) = (SELECT TOP 1 COUNT(*) from action_log group by name ORDER BY COUNT(*) DESC)
试试这个:

select name, COUNT(*)
from action_log
group by name
HAVING COUNT(*) = (SELECT TOP 1 COUNT(*) from action_log group by name ORDER BY COUNT(*) DESC)

您可以通过子查询来实现这一点,但分组依据有一些规则。用一个视图来简化它怎么样:

create view cname as
    select name, count(name) c
    from action_log
    group by name
然后像这样选择:

select distinct a.name
from action_log a
  join cname c on c.name = a.name
where c.c = (select max(c) from cname)

下面是一个例子来证明这一点。

您可以通过子查询来实现这一点,但分组方式有一些规则。用一个视图来简化它怎么样:

create view cname as
    select name, count(name) c
    from action_log
    group by name
然后像这样选择:

select distinct a.name
from action_log a
  join cname c on c.name = a.name
where c.c = (select max(c) from cname)
这里有一个例子来证明这一点


您可以使用子查询来实现这一点

例如:

SELECT MAX(cnt) FROM
(SELECT name, count(*) AS cnt
FROM action_log
GROUP BY name) AS gb

您可以使用子查询来实现这一点

例如:

SELECT MAX(cnt) FROM
(SELECT name, count(*) AS cnt
FROM action_log
GROUP BY name) AS gb
您可以使用函数执行此操作,因此不必多次查询表:

with cte as (
    select
        name, count(*) as total,
        rank() over(order by count(*) desc) as rnk
    from action_log
    group by name
)
select name, total
from cte
where rnk = 1
更好的是,您可以,因此您可以选择n组或n组:

with cte as (
    select
        name, count(*) as total,
        dense_rank() over(order by count(*) desc) as rnk
    from action_log
    group by name
)
select name, total
from cte
where rnk <= 2 -- or rnk in (1, 2), or rnk = 2 and so on
您可以使用函数执行此操作,因此不必多次查询表:

with cte as (
    select
        name, count(*) as total,
        rank() over(order by count(*) desc) as rnk
    from action_log
    group by name
)
select name, total
from cte
where rnk = 1
更好的是,您可以,因此您可以选择n组或n组:

with cte as (
    select
        name, count(*) as total,
        dense_rank() over(order by count(*) desc) as rnk
    from action_log
    group by name
)
select name, total
from cte
where rnk <= 2 -- or rnk in (1, 2), or rnk = 2 and so on

澄清一下,您正在寻找最多的人,对吗?您是否可以在sql语句中添加一个按计数排序的行?@Elias是最多的人。有时有多个用户同时拥有相同的计数,这是最大计数。@tigeravatar有一个按计数排序的用户。为了澄清,您正在寻找最多的用户,对吗?您不只是在sql语句中添加一个按计数排序的行吗?@Elias是最多的用户。有时有多个用户同时拥有相同的最大计数。@tigeravatar有一个order by count。I get列n必须出现在GROUP by子句中,或在聚合函数中使用。当我运行此命令时,I get列n必须出现在GROUP BY子句中,或者在聚合函数中使用。当我运行这个。