这是我需要的英文查询:
显示动物身份,姓名和动物检查次数,检查次数最多。
考虑可能存在第一名的关系。在这种情况下,应该归还所有绑定的动物。
这是一些相关的SQL:
select an_id, an_name, count(distinct ex_id) as NumberExams
from vt_animals
join vt_exam_headers using (an_id)
如何在不使用desc
和limit
且理想情况下使用group by
的情况下执行此操作?我想过使用max
,但它似乎不适用于count
。
答案 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