0

私は SQL の知識が非常に限られているため、ここで提供されている 4 つの異なる同様のソリューションを試しましたが、まだエラー メッセージが表示されます。

私はSQL2005を使用しています。

plans学生の学習計画に関する情報を保存するデータベース テーブル (名前は ) に対してクエリを実行したいと考えています。学生の最新の計画のみをクエリで取得したいと思います。たくさんのコラムがありますが、とりあえず手に入れたいコラムは…

PlanID  
PlanStatus  
PlanDate  
PlanEndDate  
StudentID  
Firstname  
Lastname

StudentID1 つのプラン(最新のプラン)ごとに 1 つのプランだけをプルしたいと考えています。を使用して、PlanDate最新の計画を判断することを計画していました。JOINS同様の質問で見たさまざまなステートメントを試しMAXてみましたが、それぞれがエラーメッセージを返します。

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 (Common Table Expression) は、各学生 ID と対応する最大日付を選択しますが、今日より前のものからのみ選択します。メイン クエリでは、これを内部結合で使用して、必要な行をフィルター処理します。

于 2013-11-08T15:28:43.330 に答える
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 に答える