postgresql - 在 PostgreSQL 中检查组内的条件

标签 postgresql group-by having

我有一张表格,其中包含与属于类(class)的学生相关的信息,这些学生参加了特定级别的考试(知识级别)。对于每个知识级别,都有多个考试(如果是 knowledge_level 1,考试是 ID 为 1 和 2 的考试,如果是 knowledge_level 2,考试是 ID 为 3 和 4 的考试)。

Course     Student   Exam_ID       Knowdledge_level    Passed
A          25        1             1                   yes
A          25        2             1                   yes
A          25        3             2                   no
A          25        4             2                   yes
A          26        1             1                   no
A          26        2             1                   no
A          26        3             2                   no
A          26        4             2                   no

我希望每个学生(25 岁和 26 岁)获得的是已通过所有考试的最高知识水平。对于学生 25,结果应该是 1,因为他通过了所有级别 1 的考试,但没有通过一次级别 2 的考试,所以他不能完全达到知识级别 2,对于学生 26,级别应该是NULL(或零)因为他没有通过任何考试。

我想知道哪个查询应该返回所需的结果,在这种情况下:

Course     Student   Knowdledge_level    
A          25        1  
A          26        NULL (or zero)

你能帮帮我吗? :)

谢谢!

最佳答案

使用 bool 聚合函数bool_and() :

select course, student, max(knowledge_level) as knowledge_level
from (
    select 
        course, 
        student, 
        case when bool_and(passed) then knowledge_level else 0 end as knowledge_level
    from exams
    group by course, student, knowledge_level
    ) s
group by course, student
order by course, student

 course | student | knowledge_level 
--------+---------+-----------------
 A      |      25 |               1
 A      |      26 |               0
(2 rows)

this live demo您可以看到如何通过简单的步骤构建查询。

关于postgresql - 在 PostgreSQL 中检查组内的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57930882/

相关文章:

postgresql - 在 Heist 模板中使用 postgresql-simple 的结果

python - Pandas groupby 两列然后获取值的字典

sql - 甲骨文 SQL : SQL join with group by (count) and having clauses

postgresql - 无法识别 Postgres COPY FORCE_NOT_NULL 选项

postgresql - 在处理文本搜索和地理空间数据时如何影响 Postgres 查询分析器

node.js - Sequelize 不加入关系

mysql - 加入后获得团体最大值(value)

python - pandas groupby 根据条件连接

带有 group by 和 having 子句的 Mysql 查询

mysql - 预期结果不是来自 mysql INNER JOIN