如何创建SQL查询以查找聚合函数的最大值,例如" count"?

时间:2014-03-19 07:18:07

标签: mysql sql

这是我需要的英文查询:

显示动物身份,姓名和动物检查次数,检查次数最多。
考虑可能存在第一名的关系。在这种情况下,应该归还所有绑定的动物。

这是一些相关的SQL:

select an_id, an_name, count(distinct ex_id) as NumberExams
from vt_animals
join vt_exam_headers using (an_id)

如何在不使用desclimit且理想情况下使用group by的情况下执行此操作?我想过使用max,但它似乎不适用于count

4 个答案:

答案 0 :(得分:1)

您必须对不在聚合函数

中的列名使用group by子句
select an_id, an_name, count(distinct ex_id) as NumberExams
from vt_animals
group by an_id, an_name

答案 1 :(得分:1)

首先选择大多数考试的动物:

SELECT an_id,count(ex_id) FROM animals GROUP BY an_id ORDER BY count(*) DESC LIMIT 1

然后您可以将其用作子查询。

说明:按count(*)降序对此表进行排序,然后选择top 1,这是最大值。

答案 2 :(得分:1)

如果我很好地理解了这个问题,那么如果不止一个人的考试次数最多,那么这样的动物将会返回这群动物:

SELECT a.an_id, a.an_name, a.number_exams
FROM (SELECT an_id, an_name, COUNT(ex_id) as number_exams
      FROM vt_animals
      JOIN vt_exam_headers USING (an_id)
      GROUP BY an_id) AS a
HAVING a.number_exams >= MAX(a.number_exams)

答案 3 :(得分:0)

根据您使用的数据库产品,这可能会有所不同。例如,emibloque的答案在MS SQL Server中不起作用,因为having子句需要与group by子句相对应。在这种情况下,你必须按照这些方针做点什么:

select * from
(
    select an_name, count(*) exams
    from vt_animals a join vt_exam_headers e on a.an_id = e.an_id
    group by an_name
) sub1
where exams =
(
    select max(exams) from
    (
        select an_id, count(*) exams
        from vt_exam_headers
        group by an_id
    ) sub2
)

或者如果您更喜欢使用变量:

declare @max_exams int;
select @max_exams = (
    select max(exams) from
    (
        select an_id, count(*) exams
        from vt_exam_headers
        group by an_id
    ) sub 
);
select * from
(
    select an_name, count(*) exams
    from vt_animals a join vt_exam_headers e on a.an_id = e.an_id
    group by an_name
) sub1
where exams = @max_exams