【问题标题】:Find students studying two subjects with three different roles SQL查找学习两个具有三个不同角色 SQL 的科目的学生
【发布时间】:2021-03-27 23:28:22
【问题描述】:

我有一张表 students,其中包含学生 id科目 和每个科目的角色数量。如何找到至少学习了两门学科的学生,而他们恰好扮演了三个角色?

student    subject    num_roles
1000       223        2
1000       223        1
-------------------------------
1043       243        3
-------------------------------
1002       109        3
1002       230        3
1002       200        1            valid student
...

我只能想到找到等于3num_roles 的学生和他们的科目。但是如何修改代码以找到至少在2 科目中具有3 角色的学生?

SELECT s.student, s.subject
FROM students s
WHERE s.num_roles = 3 
ORDER BY s.student, s.subject; 

预期输出:

student     subject 
1002        109
1002        230
... 

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:
      Select student , subject 
      From students 
      where student in (
        Select student 
        From students 
        where num_roles = 3
        Group by student having count(subject) >1
      )
      and num_roles = 3
    

    【讨论】:

      【解决方案2】:

      EXISTS 简单快速:

      SELECT student, subject
      FROM   students s1
      WHERE  num_roles = 3
      AND    EXISTS (  -- same student has another subject with 3 roles
         SELECT FROM students s2
         WHERE  s2.num_roles = 3
         AND    s2.student = s1.student
         AND    s2.subject <> s1.subject
         )
      ORDER  BY 1,2;
      

      (num_roles, student) 上的多列索引将是此查询的最佳选择。 (通常情况下,将subject 附加到索引是不值得的。)

      使用GROUP BYcount() 的查询成本更高,并且必须使用整个表的顺序扫描,以及另一个索引(或顺序)扫描。使用EXPLAIN / EXPLAIN ANALYZE 进行测试。

      【讨论】:

        【解决方案3】:

        如果您对每个学生一排感到满意,您可以使用array_agg() 合并科目:

        SELECT s.student, ARRAY_AGG(s.subject) as subjects
        FROM students s
        WHERE s.num_roles = 3 
        ORDER BY s.student, s.subject
        HAVING COUNT(*) >= 2;
        

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2021-06-03
          • 1970-01-01
          • 2022-10-04
          • 2018-03-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多