我正在尝试设置一个二进制列,以显示学生是否已注册S1或S2学期。
如果该值为0,则生成第二行。是否可以将每条记录限制为一行?
select A.ID BSU_ID,
A.person_uid BAN_ID,
A.NAME STU_NAME,
B.STUDENT_CLASSIFICATION_DESC BSU_Class,
A.ACADEMIC_YEAR YEAR,
A.ACADEMIC_PERIOD TERM,
case when A.SUB_ACADEMIC_PERIOD in ('S1') then 1 else 0 end as S1_Enroll,
case when A.SUB_ACADEMIC_PERIOD in ('S2') then 1 else 0 end as S2_Enroll
from odsmgr.student_course A,
odsmgr.student B
where a.person_uid = b.person_uid
and A.id = b.id
and A.name = b.name
and A.academic_period = '201950'
and B.academic_period = '201950'
and A.COURSE_BILLING_CREDITS >0.0
and A.registration_status is not null
order by 1
示例输出(为简便起见,删除了一些列):
|BSU_ID |STU_NAME |BSU_CLASS |S1_ENROLL |S2_ENROLL
|999 |Michele M |Non-Degree |1 |0
|999 |Michele M |Non-Degree |0 |1
|999 |Michele M |Non-Degree |1 |0
|999 |Michele M |Non-Degree |0 |1
答案 0 :(得分:0)
使用row_number()
select * from ( select
A.ID BSU_ID,
A.person_uid BAN_ID,
A.NAME STU_NAME,
B.STUDENT_CLASSIFICATION_DESC BSU_Class,
A.ACADEMIC_YEAR YEAR,
A.ACADEMIC_PERIOD TERM,
case when A.SUB_ACADEMIC_PERIOD in ('S1') then 1 else 0 end as S1_Enroll,
case when A.SUB_ACADEMIC_PERIOD in ('S2') then 1 else 0 end as S2_Enroll,
row_number() over(partition by A.person_uid order by A.ACADEMIC_PERIOD ) rn
from odsmgr.student_course A join
odsmgr.student B
on
a.person_uid = b.person_uid
and A.id = b.id
and A.name = b.name
and A.academic_period = '201950'
and B.academic_period = '201950'
where
A.COURSE_BILLING_CREDITS >0.0
and A.registration_status is not null
) cte where rn=1