我需要帮助来确定学校中每位教师辞职前1-3个月中有多少位救济老师。如果减免的最新No_of_reliefs_1
不在老师{{的1-3个月内),则预期输出中的No_of_reliefs_2
,No_of_reliefs_3
,end_date
应等于0 1}}。
resign_date
和Start_dt
是指救济教师的开始日期和结束日期。
End_dt
指的是每个No_of_relief
具有的不同的relief_id
。
teacher_id
预期输出:
Teacher_ID Relief_ID Resign_date Start_date End_date No_of_Reliefs
12 20 2019-05-21 2019-03-22 2019-04-28 1
12 6 2019-05-21 2019-04-02 2019-04-22 1
12 10 2019-05-21 2019-01-01 2019-01-10 1
12 7 2019-05-21 2018-10-02 2018-11-15 1
23 21 null 2019-05-05 2019-05-18 1
23 18 null 2019-02-01 2019-03-30 1
23 30 null 2019-09-20 2018-12-20 1
1 4 2018-11-02 2018-08-10 2019-09-15 1
我知道我可能必须使用connectby子句来查找Teacher_ID Resign_date No_of_relief_1 No_of_relief_2 No_of_relief_3
12 2019-05-21 2 1 0
23 null 0 1 0
1 2018-11-02 0 1 1
和Start_dt
之间的日期。但是,由于我有大量数据,因此执行起来将花费很长时间。因此,我想知道是否还有其他更简单的方法可以做到这一点。
谢谢!任何帮助将不胜感激!
答案 0 :(得分:1)
您需要使用聚合(GROUP BY)函数来计算每位老师的减免数量。使用CASE设置有条件的总和。
select teacher_id
,resign_date
,sum(case
when resign_date is null then 0
when end_date >= resign_date - interval '1' month then no_of_reliefs
else 0
end ) as no_of_reliefs_1
,sum(case
when resign_date is null then 0
when end_date < resign_date - interval '1' month
and end_date >= resign_date - interval '2' month then no_of_reliefs
else 0
end ) as no_of_reliefs_2
,sum(case
when resign_date is null then 0
when end_date < resign_date - interval '2' month
and end_date >= resign_date - interval '3' month then no_of_reliefs
else 0
end ) as no_of_reliefs_3
from your_table
group by teacher_id
,resign_date
注意:您的预期输出似乎不是从遵循您发布的规则的示例输出中得出的。我怀疑这是一个“粘贴”问题:例如,当老师23尚未辞职时,他们怎么能将No_of_relief_2
= 1?因此,我已尽我所能。如果按照您的预期无法解决问题,请编辑问题以阐明您的要求并调整所需的输出。