SQL:具有相同 ID 但不同状态的每行的情况条件

问题描述 投票:0回答:1

我正在尝试编写一个案例条件,但没有得到预期的结果。

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

我的查询中的问题是它正在检查同一行中的状态。 让我知道我该怎么做 `

sql database google-bigquery
1个回答
-1
投票

如果您想坚持您的情况,这里有一个可能的解决方案。由于我没有使用 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

© www.soinside.com 2019 - 2024. All rights reserved.