SQL查询-需要在SELECT或Subquery中搜索值日期范围



早上好,

不可否认,在SQL查询方面,我还是个新手。。。话虽如此,我的技术正在进步!

我有一个学生人口统计查询,也需要填写";"学习模式";的首选项具体日期范围。

在2020年疫情期间,我们学校正在使用混合模式。学生可以是面对面的、混合的或远程的。我正在加入一个跟踪该偏好的表格。挑战在于学生的身份可能会改变。例如,学生可以在年初开始混合动力,家长可以选择将他们转移到远程。当这种情况发生时,会在表中放入一个新条目。我需要能够通过特定的月份或日期范围来显示学生的学习偏好。

以下是学生学习偏好表的查询示例:

SELECT SLP.STUDENTSDCID, DECODE (SLP.LEARNINGPREFERENCE,01,'in-person',02,'Hybrid',03,'Remote') AS LEARNINGPREFERENCE, 
TO_CHAR(SLP.EFFECTIVEDATE,'MM/DD/YYYY') AS EFFECTIVEDATE

FROM S_STU_LEARNINGPREF_C SLP
ORDER BY SLP.STUDENTSDCID

日期2020年9月16日2020年9月16日2020年9月16日2020年9月16日
学生ID首选项
3432混合动力
3506混合
3541混合
3563亲自2020年9月17日
3563混合2020年9月16日
3588混合动力

最明显的解决方案是创建一个包含首选项的表,例如

create table preference as
select '01' pref_id, 'in-person' name from dual union all
select '02'        , 'hybrid'         from dual union all
select '03'        , 'remote'         from dual;

并将其与您的其他查询结合起来:

select 
s.studentsdcid,
p.name learningpreference,
to_char(s.effectivedate, 'mm/dd/yyyy') effectivedate
from s_stu_learningpref_c s join preference p on p.id = s.learningpreference
order by s.studentsdcid;

否则,如果你不能创建一个表(尽管,我看不出你为什么不创建(,你可以使用子查询或CTE(通用表表达式,也称为WITH因子分解子句(,例如

with preference (pref_id, name) as
(select '01' pref_id, 'in-person' name from dual union all
select '02'        , 'hybrid'         from dual union all
select '03'        , 'remote'         from dual
)
select 
s.studentsdcid,
p.name learningpreference,
to_char(s.effectivedate, 'mm/dd/yyyy') effectivedate
from s_stu_learningpref_c s join preference p on p.id = s.learningpreference
order by s.studentsdcid;

每个学生都会有偏好吗?如果是,则可以使用CTE或子查询的联接来获取最大首选项日期。

例如

SELECT S.STUDENT_NUMBER, S.STATE_STUDENTNUMBER AS SASID, NVL(SCF.PSCORE_LEGAL_FIRST_NAME,S.FIRST_NAME) AS FNAME, 
NVL(SCF.PSCORE_LEGAL_MIDDLE_NAME,S.MIDDLE_NAME) AS MNAME, NVL(SCF.PSCORE_LEGAL_LAST_NAME,S.LAST_NAME) AS LNAME,
TO_CHAR(S.DOB,'MM/DD/YYYY') AS DOB, '' AS FREE_REDUCED_IND, 
NVL(NVL(LTRIM(regexp_substr(S.MOTHER, '[^,]+', 1, 2)),LTRIM(regexp_substr(S.FATHER, '[^,]+', 1, 2))),SCF.GUARDIAN_FN) AS PRIMARY_CONTACT_FNAME,
NVL(NVL(LTRIM(regexp_substr(S.MOTHER, '[^,]+', 1, 1)),LTRIM(regexp_substr(S.FATHER, '[^,]+', 1, 1))),SCF.GUARDIAN_LN) AS PRIMARY_CONTACT_LNAME,
regexp_substr(S.MAILING_STREET, '[^,]+', 1, 1) AS STU_STREET_ADDR_1, regexp_substr(S.MAILING_STREET, '[^,]+', 1, 2) AS STU_STREET_ADDR_2, 
S.MAILING_CITY AS STU_STREET_CITY, S.MAILING_ZIP AS STU_STREET_ZIP, '0'||S.SCHOOLID AS SCHOOL_ID,
DECODE(S.SCHOOLID,1690005,'0169',1730005,'0173',1730010,'0173',2500005,'0250',7400405,'0740',7400505,'0740') AS DISTRICT_CODE,'' AS OCT_MODE, '' AS NOV_MODE

DECODE (SLP.LEARNINGPREFERENCE,01,'in-person',02,'Hybrid',03,'Remote') AS "LEARNINGPREFERENCE", TO_CHAR(SLP.EFFECTIVEDATE,'MM/DD/YYYY') AS EFFECTIVE_DATE

FROM STUDENTS S
LEFT JOIN STUDENTCOREFIELDS SCF ON S.dcid = SCF.studentsdcid
LEFT JOIN S_STU_LEARNINGPREF_C SLP ON S.dcid = SLP.studentsdcid
JOIN (Select studentsdcid, max(EFFECTIVEDATE) lastDate from S_STU_LEARNINGPREF_C group by studentsdcid) lastPref ON SLP.studentsdcid = lastPref.studentsdcid and SLP.EFFECTIVEDATE = lastPref.lastDate

WHERE S.ENROLL_STATUS = '0'
ORDER BY S.LAST_NAME, S.FIRST_NAME

最新更新