2017-04-10 5 views
0

私の問題はこの文脈の中に挿入されています: 私は、課外課程の学生用アプリケーションを管理するシステムを持っています。これらのアプリケーションは、次のような構造を持つテーブルに格納されています。最新の行を選択してください

  • StudentId:学生のID [主キー]
  • CourseId:もちろんのID [主キー]
  • StatusVerificationDate:アプリケーションのステータスが確認された日付[Primary Key]
  • ステータス:現在のアプリケーションステータス(「進行中」、「拒否」、「承認済み」)

私の問題は次のとおりです。学生とコースごとに、最新の行を取得する必要があります。上記の例では

StudentId CourseId StatusVarificationDate  Status 
1   1001  2011-12-12 07:27:24 In Progress 
1   1001  2011-12-12 09:27:24 In Progress 
1   1002  2011-12-13 15:27:24 Admited 
2   1001  2011-12-12 09:27:24 In Progress 
2   1001  2011-12-12 15:27:24 Admited 

、どのように私はこの結果を得ることができますか?

StudentId CourseId StatusVerificationDate  Status 
1   1001  2011-12-12 09:27:24 In Progress 
1   1002  2011-12-13 15:27:24 Admited 
2   1001  2011-12-12 15:27:24 Admited 
+0

https://i.imgur.com/lUmelWO.png大丈夫です。 – Sebas

+0

私はここで新しいです、申し訳ありません、次回は試して投稿します。 –

答えて

0

使用ROW_NUMBER()以下のようにパーティションを有する:row_number()を用い

;With T AS 
(
    SELECT 
     *,   
     ROW_NUMBER() OVER(PARTITION BY StudentId,CourseId ORDER BY StatusVarificationDate DESC) AS PartNo 
    FROM @tblTest 
) 
SELECT 
    * 
FROM T 
WHERE PartNo=1 
+0

私はそれが 'StudentId、CourseIdによって区切られるべきだと思います。 – TriV

+0

はい@Triv私の間違い、訂正ありがとう –

+0

あなたの早い返信をありがとう。私はSQLでとても多くの経験を持っていないので、 'パーティション'は私には新しいものです。なぜこのキーワードでこのキーワードを使用しているのかを簡単に説明できますか? –

0

使用MAX集約関数でJOINステートメント:

SELECT * 
FROM table1 
JOIN 
(
    SELECT StudentId, CourseId MAX(StatusUpdateDate) Maxdate 
    FROM table1  
) A ON A.Maxdate = StatusUpdateDate AND A.StudentId = table1.StudentId 
1

これは、通常、扱われる。

select t.* 
from (select t.*, 
      row_number() over (partition by StudentId, CourseId 
           order by StatusVarificationDate desc 
           ) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
関連する問題