2017-01-26 11 views
-1

すべての学生をDESCでリストする必要があります。アルゴリズムのこれらのSQLテーブルから最大日付を取得する方法

手順:テーブルSTUDENT_TYPEで

  1. 、すべての学生のために、最大DT_OF_WORK日がレコードのTYPE_IDを取得します。 TYPE_IDで

  2. は彼らのDESCを持つ学生からのすべての学生のテーブルSTUDENT_DESC

  3. 一覧からDESCを取得し、発見しました。

ここに3つのSQLテーブルがあります。

STUDENT_TYPE

主キーである:(Student_ID, DT_OF_WORK

|Student_ID | TYPE_ID | DT_OF_WORK | CATEGORY| 
|   1 |  1 | 01-JAN-2017 |   B| 
|   1 |  2 | 11-JAN-2017 |   A| 
|   1 |  1 | 02-JAN-2017 |   A| 
|   1 |  1 | 03-JAN-2017 |   A| 
|   3 |  2 | 16-JAN-2017 |   A| 
|   3 |  1 | 03-JAN-2014 |   A| 
|   3 |  1 | 23-JAN-2012 |   A| 
|   4 |  2 | 02-JAN-2013 |   A| 

STUDENT_DESC

|TYPE_ID|DESC | 
|  1|LEAD | 
|  2|TOPPER| 

STUDENT

|STUDENT_ID|NAME | 
|   1|JACK | 
|   2|RAVI | 
|   3|SEENU | 
|   4|RAM | 
  • STUDENT_ID(STUDENT_TYPE)= STUDENT_ID(学生)
  • TYPE_ID(STUDENT_TYPE)= TYPE_ID(STUDENT_DESC)

所望の出力:お時間を

|STUDENT_ID|NAME |DESC | 
|   1|JACK |LEAD | 
|   2|RAVI |null | 
|   3|SEENU |TOPPER| 
|   4|RAM |TOPPER| 

感謝。

+2

あなたはどのRDBMSを使用していますか? MySQL? Postgresql? SQLサーバー? – Cameron

答えて

1

複数のがあります。これを達成するにはさまざまな方法があります。そして、あなたはどのデータベースエンジンを指定していないので、私はSQL Serverを想定していました。

これは最もパフォーマンスではないかもしれないが、これはトリックを行う必要がありますされているか、大きなあなたのテーブルを考える:

WITH Rankings 
      AS (SELECT * 
       FROM  (SELECT st.Student_ID 
            , st.Type_Id 
            , ROW_NUMBER() OVER (PARTITION BY st.Student_ID ORDER BY st.DT_Of_Work DESC) AS RowNumber 
          FROM  Student_Type AS st) q 
       WHERE q.RowNumber = 1) 
    SELECT s.Student_Id 
      , s.Name 
      , d.[Desc] 
    FROM Student s 
    LEFT OUTER JOIN Rankings c 
    ON  s.Student_Id = c.Student_Id 
    LEFT OUTER JOIN Student_Desc d 
    ON  d.Type_ID = c.Type_ID; 

これが効果的に行を分割し、それらのパーティションに基づいて番号を与えることによって動作し、 ROW_NUMBER()機能で注文してください。次に、最も低い値(1の値)を選択し、それを使用して最新のType_Idを決定します。いくつかの助けを借りてouter joins、我々はすべてのデータを取得することができます。

サイドノート:予想される出力が正しくありません。ジャックのDESCTOPPERである必要があります。

関連する問題