2013-09-27 51 views
2

我試圖用表中的最大條目數返回名稱,併爲那些count爲最大的返回(name,count)元組列表。我目前的解決方案使用:如何使用字段獲取所有最大數量

select name, count(*) 
from action_log 
group by name 
order by count desc 
limit 1; 

的問題是,使用limit 1不考慮具有最大計數值多個名稱。

如何確定最大計數,然後獲得所有匹配的名稱?我想(但不能明顯地)做這樣的事情:

select name, max(count(*)) 
from action_log 
group by name; 
+0

爲了澄清,你要尋找的是出現的人大多數,對嗎? – Elias

+0

難道你只是添加一個'ORDER BY COUNT'行到sql語句? – tigeravatar

+0

@Elias最多的「人」。有時候,有多個用戶具有相同的計數,同時也是最大計數。 – alh

回答

3

SQL Fiddle

with s as (
    select name, count(*) as total 
    from action_log 
    group by name 
), m as (
    select max(total) as max_total from s 
) 
select name, total 
from s 
where total = (select max_total from m) 
0

試試這個:

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) 
1

你可以使用子查詢做到這一點 - 除了有圍繞該組的一些規則。如何以期簡化IT:

create view cname as 
    select name, count(name) c 
    from action_log 
    group by name 

然後SELECT這樣的:

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

,這裏是一個SQL Fiddle來證明這一點。

0

你可以用子查詢

做到這一點。例如:

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

我得到'列「n」必須出現在GROUP BY子句中或用於聚合函數中.'當我運行這個時。 – alh

+0

@alh編輯我的答案 – evilone

0

你可以用rank()功能做到這一點,所以你不必查詢表的多個次:

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 

更妙的是,你可以dense_rank(),所以你可以把N個組或採取n組:

​​

sql fiddle demo

相關問題