SQL Server-按具有值的大多数行聚合
给一张桌子SQL Server-按具有值的大多数行聚合,sql,aggregate-functions,Sql,Aggregate Functions,给一张桌子 id name 1 Joe 2 Bob 3 Joe 4 Joe 5 Bob 我想做一个聚合选择,返回行数最多的“name” 举例来说,上面有3'乔的,只有2'鲍勃的。因此,我想返回“Joe” 我不相信SQL Server中有专门用于执行此操作的聚合函数count和max无法完成此任务 更新 我想我可以说: select max(names) as winning_name from ( select
id name
1 Joe
2 Bob
3 Joe
4 Joe
5 Bob
我想做一个聚合选择,返回行数最多的“name”
举例来说,上面有3'乔的,只有2'鲍勃的。因此,我想返回“Joe”
我不相信SQL Server中有专门用于执行此操作的聚合函数count
和max
无法完成此任务
更新
我想我可以说:
select max(names) as winning_name
from (
select name,
count(*) as names
from ultimate_table
group by name
) as grp
但是没有子查询有更好的方法吗?首先,这将按频率排序:
SELECT name FROM name_table ORDER BY count(1) DESC
然后,您只需将结果限制为1行,具体取决于SQL风格:
SELECT name FROM name_table ORDER BY count(1) DESC LIMIT 1
或
如果多个名称的出现次数最多,则必须使用子查询
输出
NAME
----
Batman
Joe
如果您希望所有名称具有相同的最大计数,则此方法有效,结果可能大于1。我在问题中提供的查询不是在更少的代码中存在相同的内容吗?
select name from name_table
group by name
having count(*)= (select max(names)
from (
select
count(*) as names
from name_table
group by name
) as grp
)
create table name_table(id int,name varchar(10));
insert into name_table values(1,'Joe');
insert into name_table values(2,'Bob');
insert into name_table values(3,'Joe');
insert into name_table values(4,'Joe');
insert into name_table values(5,'Batman');
insert into name_table values(6,'Batman');
insert into name_table values(7,'Batman');
NAME
----
Batman
Joe