【问题标题】:Compare two Count() values sql比较两个 Count() 值 sql
【发布时间】:2021-12-03 09:55:35
【问题描述】:

我有一个名为“Takes”的表格,其中包含以下信息。 Takes(stud_id, class_id, sec_id, 学期, 年, 年级)

我想找出 2009 年比 2010 年上更多课的学生的 ID(就课程数量而言。 我已经使用以下代码提取了 2009 年学生的总班级数,但不知道如何进行比较

select stud_id, count(class_id) from Takes where year = 2009 group by stud_id;

【问题讨论】:

标签: sql count aggregate


【解决方案1】:

这不是最有效的查询,但你可以试试这个:

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
);

【讨论】:

  • 您是对的,您的查询可以更有效地编写。我已经为您完成了这项工作,并使用该查询更新了您的答案。
  • @ThorstenKettner 谢谢,写得很好。
【解决方案2】:

您可以使用条件聚合(聚合函数中的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);

【讨论】:

  • 我会添加where year in (2009, 2010),可能会提高性能。
  • 是的,这是个好主意。
【解决方案3】:

根据 dbms,2009 年左连接 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

(假设年份列已编入索引。)

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多