连接聚合函数中的条件需要来自超出范围的表中的值

问题描述 投票:0回答:3

这里是问题的详细信息...

表一:【学生人数】

学生 课程 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'
sql sql-server tsql scope greatest-n-per-group
3个回答
1
投票

您可以为此使用

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;

db<>小提琴


0
投票

您可以使用

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

小提琴


0
投票

您可以使用SQLwindonw函数和SQL Serverdatediff()函数通过以下步骤得到您想要的结果:

  1. 根据学生加入student_enrollment和student_track表,跟踪active状态,enroll_dt要晚于declear_dt
  2. 对每个(学生、课程)使用窗口函数来获取与 enroll_date 相比的最新曲目 declear_date。
  3. 获取每个(学生,课程)的顶行。

这里是查询

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
© www.soinside.com 2019 - 2024. All rights reserved.