我正在尝试编写一个案例条件,但没有得到预期的结果。
Query:
select case when subject='maths' and subject='PCM' then 'Science_student'
case when subject='biology' and subject='arts' then 'Non-Pcm' end student_type
from students
`
Data looks like:
Studentid subject date_added
12184 maths 15mar2024
12184 arts 15mar2024
12184 PCM 14mar2024
12185 accounts 11aug2024
12185 arts 10aug2024
12198 biology 17aug2024
12198 arts 16aug2024 `
因此,如果学生 ID 的状态是“Maths”和“PCM”,那么它应该标记为“Science_student” 如果状态是“生物学”和“艺术”,那么它应该标记为“非 Pcm”
预期输出:
Studentid subject date_added Student_type
12184 maths 15mar2024 null
12184 arts 15mar2024 null
12184 PCM 14mar2024 Science_student
12185 accounts 11aug2024 null
12185 arts 10aug2024 null
12198 biology 17aug2024 null
12198 arts 16aug2024 Non-pcm
我的查询中的问题是它正在检查同一行中的状态。 让我知道我该怎么做 `
如果您想坚持您的情况,这里有一个可能的解决方案。由于我没有使用 google-bigquery 的经验,这里是一个 Postgresql 解决方案。深入研究 bigqueries - 文档:array_agg 存在,我不知道任何 - 搜索数组的语法。
https://sqlfiddle.com/postgresql/online-compiler#?id=32960553-4d79-4d65-a296-9669deb0e9c9
with data as (select studentid, array_agg(subject) as subjects from students group by studentid)
select
students.*,
case
when 'maths'=any(subjects) and 'PCM'=any(subjects) then 'Science_student'
when 'biology'=any(subjects) and 'arts'=any(subjects) then 'Non-Pcm'
end student_type
from students inner join data on students.studentid = data.studentid
因此,在 CTE 中,有为每个学生收集的所有科目的数组,并且在构造这些数组时通过 any(科目)进行搜索。
但是,您确定您的测试数据吗?每个学生 ID 的学生类型不应该相同吗?学生 ID 12184 的每一行应为 Science_student。