0

我对 SQL 的了解非常有限,并尝试了此处提供的 4 种不同的类似解决方案,但我仍然收到错误消息。

我正在使用 SQL2005。

我想plans在存储有关学生学习计划的信息的数据库表(名为 )上运行查询。我希望查询只获取学生的最新计划。有很多专栏,但我现在想了解的专栏是......

PlanID  
PlanStatus  
PlanDate  
PlanEndDate  
StudentID  
Firstname  
Lastname

我希望每个StudentID(最近的计划)只提取一个计划。我正计划使用PlanDate来确定最近的计划。我尝试了在类似问题中看到的各种JOINSMAX陈述,每个陈述都为我返回一条错误消息。

4

3 回答 3

1

这个假设将来可能有PlanDates,“最近的”意味着“最新的,比今天更早”。

WITH CTE AS
(
    SELECT 
      P.StudentID,
      MAX(P.PlanDate) AS MostRecentPlanDate
    FROM plans P
    WHERE P.PlanDate < GETDATE()
    GROUP BY P.StudentID
)
SELECT P.*
FROM
    plans P
    INNER JOIN CTE ON CTE.StudentID = P.StudentID 
      AND CTE.MostRecentPlanDate = p.PlanDate

CTE(公用表表达式)选择每个学生 ID 和相应的最大日期,但仅从今天之前的那些中选择。在主查询中,内部连接使用它来过滤想要的行。

于 2013-11-08T15:28:43.330 回答
0

这应该工作!

select
    PlanStatus,  
    max(PlanDate) , 
    max(PlanEndDate) , 
    StudentID,  
    Firstname , 
    Lastname
from plans 
group by PlanStatus  , StudentID, Firstname, Lastname 
于 2013-11-08T15:14:40.303 回答
0
SELECT A.*
  FROM [plans] A
  LEFT OUTER JOIN [plans] B ON B.PlanDate > A.PlanDate 
                           AND B.StudentID = A.StudentID
 WHERE B.PlanID IS NULL

这就是说,基本上,给我所有没有具有更高计划日期和相同学生 ID 的行的行。

编写此查询的另一种等效方法可能更易于人类理解,但在 Sql Server 中运行速度要慢得多

SELECT A.*
  FROM [plans] A
 WHERE NOT EXISTS (SELECT *
                     FROM [plans] B 
                    WHERE B.PlanDate > A.PlanDate 
                      AND B.StudentID = A.StudentID)
于 2013-11-08T15:15:46.363 回答