在 PostgreSQL 中检查组内的条件
Check condition inside group in PostgreSQL
我有一个 table,其中包含与属于课程的学生相关的信息,这些课程参加了特定级别的考试 (knowdledge_level)。对于每个知识级别,都有几项考试(在 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(或零)因为他没有通过任何考试。
我想知道哪个查询应该 return 想要的结果,在这种情况下:
Course Student Knowdledge_level
A 25 1
A 26 NULL (or zero)
你能帮帮我吗? :)
谢谢!
使用布尔聚合函数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 中,您可以了解如何通过简单的步骤构建查询。
我有一个 table,其中包含与属于课程的学生相关的信息,这些课程参加了特定级别的考试 (knowdledge_level)。对于每个知识级别,都有几项考试(在 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(或零)因为他没有通过任何考试。
我想知道哪个查询应该 return 想要的结果,在这种情况下:
Course Student Knowdledge_level
A 25 1
A 26 NULL (or zero)
你能帮帮我吗? :)
谢谢!
使用布尔聚合函数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 中,您可以了解如何通过简单的步骤构建查询。