这里是问题的详细信息...
表一:【学生人数】
学生 | 课程 | ENROLL_DT |
---|---|---|
11223 | 数学123 | 01/03/2017 |
11223 | AUTO224 | 2017/03/11 |
11223 | FABR450 | 2018/09/26 |
表2:【学生轨道】
学生 | 轨道 | 声明_DT | 状态 |
---|---|---|---|
11223 | 机械原子吸收光谱 | 12/04/2016 | 活跃 |
11223 | 机械原子吸收光谱 | 02/05/2016 | 停电 |
11223 | ENGR-AAS | 2017/02/20 | 活跃 |
我想做什么:
在注册时获取最新的活动声明曲目。
学生 | 课程 | ENROLL_DT | 轨道 |
---|---|---|---|
11223 | 数学123 | 01/03/2017 | 机械原子吸收光谱 |
11223 | AUTO224 | 2017/03/11 | ENGR-AAS |
11223 | FABR450 | 2018/09/26 | ENGR-AAS |
我尝试过但无济于事:
Inner join [Student Track]
自己为学生获得最大申报日期Left join
注册到[Student Enrollment]
表代码:
SELECT
STUDENT, COURSE, ENROLL_DT, TRACK
FROM
[Student Enrollment] AS A
LEFT JOIN
(SELECT
STUDENT, TRACK, DECLARE_DT
FROM
[Student Track] AS B1
INNER JOIN
(SELECT STUDENT, MAX(DECLARE_DT) as MAX_DECLARE_DT
FROM [Student Track]
WHERE DECLARE_DT <= A.ENROLL_DT ***/* ENROLL_DT is out of scope!!!!!!!!!!!!!!!! =( */***
) as B2 ON A.STUDENT = B.STUDENT
WHERE
STATUS = 'Active'
您可以为此使用
APPLY
,它允许您从外部范围访问值。
请注意,连接条件已移至子查询内部,因为子查询(逻辑上)在外部范围的每行中执行一次。
SELECT
se.STUDENT,
se.COURSE,
se.ENROLL_DT,
st.TRACK
FROM
[Student Enrollment] AS se
OUTER APPLY (
SELECT TOP (1)
st.TRACK,
st.DECLARE_DT
FROM
[Student Track] AS st
WHERE st.DECLARE_DT <= se.ENROLL_DT
AND st.STATUS = 'Active'
AND st.STUDENT = se.STUDENT -- join condition
ORDER BY
st.DECLARE_DT DESC
) AS st;
您可以使用
ROW_NUMBER
加入表格。
为此,您应该有更多或相等的注册人数来跟踪
你也不应该在列名或表名中使用空格,它必须被转义
WITH CTE_track as (SELECT
[STUDENT],[TRACK], [DECLARE_DT], ROW_NUMBER() OVER(PARTITION BY STUDENT ORDER BY [DECLARE_DT]) rn
FROM
[Student Track]),
CTE_enroll as (SELECT
[STUDENT], [COURSE], [ENROLL_DT], ROW_NUMBER() OVER(PARTITION BY STUDENT ORDER BY [ENROLL_DT]) rn
FROM
[Student Enrollment])
SELECT
c1.[STUDENT],c1.[COURSE],c1.[ENROLL_DT],c2.[TRACK]
FROM CTE_enroll c1 LEFT JOIN CTE_track c2 ON c1.[STUDENT] = c2.[STUDENT] AND c1.rn = c2.rn
学生 | 课程 | ENROLL_DT | 轨道 |
---|---|---|---|
11223 | 数学123 | 2017-01-03 01:00:00.000 | 机械原子吸收光谱 |
11223 | AUTO224 | 2017-03-11 01:00:00.000 | 机械原子吸收光谱 |
11223 | FABR450 | 2018-09-26 02:00:00.000 | ENGR-AAS |
您可以使用SQLwindonw函数和SQL Serverdatediff()函数通过以下步骤得到您想要的结果:
这里是查询:
WITH sorted_course AS (
SELECT
e.student,
e.course,
e.enroll_dt,
t.track,
t.declear_dt,
t.status,
row_number() over (partition by e.student, e.course order by datediff(day, t.declear_dt, e.enroll_dt)) as row_num
FROM
student_enrollment e
JOIN
student_track t
ON
e.student = t.student
AND
t.status = 'Active'
AND
t.declear_dt <= e.enroll_dt
)
SELECT
student,
course,
enroll_dt,
track
FROM
sorted_course
WHERE
row_num = 1
ORDER BY enroll_dt
学生 | 课程 | enroll_dt | 轨道 |
---|---|---|---|
11223 | 数学123 | 2017-01-03 | 机械原子吸收光谱 |
11223 | AUTO224 | 2017-03-11 | ENGR-AAS |
11223 | FABR450 | 2018-09-26 | ENGR-AAS |