我有一个student_table,在此表中有一列student_financial_aid_type,下一列是date_,所以Student_financial_aid_type的值例如='direct'和date_ 1/04/2018。我使用了CTE表,并且在代码的开头有一个参数date,所以我可以得出当天的学生人数。例如我的参数日期是20/04/2019。
我的财政年度从四月到三月,例如1/04/18-19/31/3。
我的问题是,这表明学生在该财政年度获得了某种形式的经济援助,我将在输出栏中显示“ Y”或“ N”。因此,使用上面的示例,因为日期1/04/2018不在参数日期(20/04/19)的财政年度中,因此它实际上是在上一个财政年度(1/04/18-31/3 / 19),那么我希望在输出列中将其设置为“ N”,因为在参数日期(20/04/19)的财政年度中,该学生未获得任何经济资助。但是,如果我碰巧将参数日期更改为2/06/18,那么学生收到经济援助的日期(18/04/1)则以财务年度为参数日期,因此我的输出列现在将具有“ Y”反映这一点。因此,不管怎么说,它必须是动态的并响应参数日期,因为这是我作为用户将在
时更改的日期。我尝试使用date_part,并且设法获得了学生收到付款的日期的月份号,从那时起,我一直在考虑将月份号用作衡量该年份的年份的指标,但是我不确定该怎么做。
WITH
parameter_date as (
select '2019-04-26':: date p_date),
student_cohort as (select * from (
SELECT Distinct
ms.studentid,ss.student_admission_date,ms.graduation_date
FROM master_student_table ms
left join student_semeter ss on ms.student_id=ss.student_id ,
parameter_date, p
AND ss.student_admission_date <= p_date -- i.e. began studies less than
or equal to p_date
AND (ms.graduation_date is null or ms.graduation_date > p_date)) -- i.e.
student finished studies more than p_date or IS NULL
)x ),
student_finance as (select * from ( select date_part('month', st.date_::
date)
date_part, st.date_, st.studentid,st.student_financial_aid_type
from student_table st
left join student_cohort s on st.studentid = s.studentid
where st.student_financial_aid_type in ('direct' , 'indirect')
) x )
select distinct
s.student_id,
s.graduation_date,
s.admissiondate_date,
sf.date_,
-- this is what I would like it to be -- case when sf.date is in the same
--financial year as the parameter_date
--then 'Y' else 'N' end was_financial_aid_received_in_the_fy,
sf.date_part
from
cohort s
left join student_finance sf on s.student_id = sf.student_id and
sf.student_financial_aid_type = 'direct'
left join student_finance sf1 on s.student_id = sf1.student_id and
sf1.student_financial_aid_type = 'indirect' `
我希望案例陈述中的输出列'was_financial_aid_received_in_the_fy'为'Y',如果该学生获得经济援助的日期与该parameter_date在同一财年,则为'N'。不是这样
非常感谢您的帮助
答案 0 :(得分:0)
我认为这个问题基本上可以归结为以下内容:
这是使用日期范围的好地方,日期范围是我最喜欢的类型之一。我们可以从参数日期算出财政年度,并使用日期范围来表示它。如果参数日期为4月之前,则会计年度应为前一年的4月1日(含)至今年的4月1日(不含)。如果参数日期为4月之后,则会计年度应为今年的4月1日(含)至次年的4月1日(不含)。
这是一个查询,该查询应演示如何执行此操作:
WITH parameter_date as (
select '2019-04-26'::date p_date
), fiscal_year as (
select daterange(
make_date(case when date_part('month', p_date)<4
THEN date_part('year', p_date)::int-1
ELSE date_part('year', p_date)::int END,
4, 1),
make_date(case when date_part('month', p_date)<4
THEN date_part('year', p_date)::int
ELSE date_part('year', p_date)::int+1 END,
4, 1),
'[)') as f_year
FROM parameter_date
),
test_data as (
select test_date::date from (values
('2019-04-01'),
('2018-04-01'),
('2019-03-02'),
('2020-12-01'),
('2017-05-26'),
('2020-02-27'),
('2020-04-01')
) v(test_date)
)
select test_date,
CASE WHEN test_date <@ fiscal_year.f_year THEN 'Y' ELSE 'N' END as in_f_year
from test_data, fiscal_year;
test_date | in_f_year
------------+-----------
2019-04-01 | Y
2018-04-01 | N
2019-03-02 | N
2020-12-01 | N
2017-05-26 | N
2020-02-27 | Y
2020-04-01 | N
(7 rows)