我对SQL的了解非常有限,并尝试了4种不同的类似解决方案,但我仍然收到错误消息。
我正在使用SQL2005。
我想在数据库表(名为plans
)上运行查询,我们存储有关学生学习计划的信息。我希望查询只能抓住学生的最新计划。有很多专栏,但我现在想要的专栏是......
PlanID
PlanStatus
PlanDate
PlanEndDate
StudentID
Firstname
Lastname
我希望每StudentID
(最近的计划)只提出一个计划。我打算使用PlanDate
来确定最近的计划是什么。我尝试过在类似问题中看到的各种JOINS
和MAX
语句,每个语句都会为我返回错误消息。
答案 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)