Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-按具有值的大多数行聚合_Sql_Aggregate Functions - Fatal编程技术网

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