我有一个名为“Take”的表,其中包含以下信息。Take(stud_id,class_id,sec_id,semester,year,grade)
我想找出2009年上课次数比2010年多的学生的id(就班数而言)。我使用以下代码提取了2009年的学生总班数,但不确定如何进行比较
select stud_id, count(class_id) from Takes where year = 2009 group by stud_id;
发布于 2021-10-15 07:06:15
您可以使用条件聚合(聚合函数中的CASE WHEN
)和HAVING
子句:
select
stud_id,
count(case when year = 2009 then 1 end) as classes_in_2009,
count(case when year = 2010 then 1 end) as classes_in_2010
from takes
group by stud_id
having count(case when year = 2009 then 1 end) >
count(case when year = 2010 then 1 end);
发布于 2021-10-15 06:50:00
这不是最有效的查询,但您可以尝试这样做:
SELECT aa.Stud_id
FROM ( SELECT Stud_id, Year, COUNT(Class_id) Class_id
FROM Takes
GROUP BY Stud_id, Year) aa
WHERE aa.Year = 2009
AND aa.Class_id > (SELECT bb.Class_id
FROM ( SELECT Stud_id, Year, COUNT(Class_id) Class_id
FROM Takes
GROUP BY Stud_id, Year) bb
WHERE aa.Stud_id = bb.Stud_id AND bb.Year = 2010);
通过立即应用WHERE
子句并使用HAVING
进行计数比较,这将变得更加有效:
SELECT aa.Stud_id
FROM Takes aa
WHERE aa.Year = 2009
GROUP BY aa.Stud_id
HAVING COUNT(*) >
(
SELECT COUNT(*)
FROM Takes bb
WHERE bb.Stud_id = aa.Stud_id
AND bb.Year = 2010
);
发布于 2021-10-15 08:46:53
根据dbms的不同,2009年的left join 2010可能会加快速度:
select t2009.stud_id, t2009.cnt, t2010.cnt
from
(select stud_id, count(*) as cnt
from takes
where year = 2009
group by stud_id) t2009
LEFT JOIN
(select stud_id, count(*) as cnt
from takes
where year = 2010
group by stud_id) t2010
ON t2009.stud_id = t2010.stud_id AND t2009.cnt > t2010.cnt
(假设对年份列进行了索引。)
https://stackoverflow.com/questions/69580574
复制相似问题