为学生选择最新的计划

时间:2013-11-08 15:07:44

标签: sql sql-server-2005

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

我正在使用SQL2005。

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

PlanID  
PlanStatus  
PlanDate  
PlanEndDate  
StudentID  
Firstname  
Lastname

我希望每StudentID(最近的计划)只提出一个计划。我打算使用PlanDate来确定最近的计划是什么。我尝试过在类似问题中看到的各种JOINSMAX语句,每个语句都会为我返回错误消息。

3 个答案:

答案 0 :(得分: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和相应的最大日期,但仅限于今天之前的日期。在主查询中,内部联接使用它来过滤所需的行。

答案 1 :(得分:0)

这应该有效!

select
    PlanStatus,  
    max(PlanDate) , 
    max(PlanEndDate) , 
    StudentID,  
    Firstname , 
    Lastname
from plans 
group by PlanStatus  , StudentID, Firstname, Lastname 

答案 2 :(得分: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)