2017-05-03 12 views
0

私はこの1つを検索していましたが、質問に答えるような回答がたくさんありましたが、それ。私は私の特定の問題に答えを適用するように見えることはできません。テーブル内の1つのフィールドのMAXに基づいて1つのテーブルから複数の列を選択

私たちの学習者のすべてを一覧表示し、(4種類の)彼らの歴史のすべてのレコードを引っ張るか、彼らはいずれかを持っていない場合NULLを表示するクエリを持っている:

select LEARNERS.Learner_ID 
     , LEARNERS.Firstname 
     , LEARNERS.Surname 
     , HISTORY.DateStart 
     , HISTORY.Notes 
from LEARNERS left outer join 
    HISTORY on 
     LEARNERS.Learner_ID = HISTORY.Learner_ID 
      and 
     HISTORY.Category_ID in (479,480,481,482) 
order by LEARNERS.Learner_ID 

これは素晴らしい作品が、私だけここにいくつかの検索以下、各学習者のための最新の歴史を見てみたい(またはNULLなしの場合)ので、私はこれを行うにしようとしている:見事に動作します

select LEARNERS.Learner_ID 
     , LEARNERS.Firstname 
     , LEARNERS.Surname 
     , HISTORY.DateStart 
     , HISTORY.Notes 
from LEARNERS left outer join 
    (select MAX(DateStart) as LatestHistory, Learner_ID 
     from HISTORY 
     Where Category_ID in (479,480,481,482) 
     group by Learner_ID) as LatestHistoryTable on 
     LEARNERS.Learner_ID = LatestHistoryTable.Learner_ID 

をし、私は(学習者ごとに歴史を取得し、その最新のもの)。しかしながら;私が本当に必要とするのは、履歴テーブルの情報です(例:History.Notes, History.Officer, History.DateStart)。

私は単純に、サブクエリの中にさらに列を追加しようとしました:

... 
(select MAX(DateStart) as LatestHistory, Learner_ID, Notes, Officer 
     from HISTORY 
     Where Category_ID in (479,480,481,482) 
     group by Learner_ID, Notes, Officer) as LatestHistoryTable 
... 

しかし、それは、GROUP BY句で私のテキストフィールドに関するエラーを与えた:(

oを私はちょうどすることを決めました私が必要とする他の分野を引っ張って、サブクエリの外HISTORYテーブルにすることをHistoryIDフィールドを追加し、INNER JOIN

... 
(select MAX(DateStart) as LatestHistory, Learner_ID, HistoryID 
     from HISTORY 
     Where Category_ID in (479,480,481,482) 
     group by Learner_ID, HistoryID) as LatestHistoryTable 
... 

しかし、それは学習者1人あたり(私の元のクエリに似た)複数の行を生成することだったので、今私は困惑しています。

経験豊富なSQLコーダーにとっては、時間がかかっているはずですが、まだ学習しているので、私はちょっと怖いです。

おかげで、 アラン

答えて

0

あなたは以下のようにROW_NUMBERとDESCを使用することができます。

select LEARNERS.Learner_ID 
     , LEARNERS.Firstname 
     , LEARNERS.Surname 
     , LatestHistoryTable.DateStart 
     , LatestHistoryTable.Notes 
from LEARNERS left outer join 
    (select RowN = Row_Number() over(partition by Learner_id order by DateStart Desc), DateStart as LatestHistory, 
     Learner_ID, Notes, Officer 
     from HISTORY 
       Where Category_ID in (479,480,481,482) 
      ) as LatestHistoryTable on 
     LEARNERS.Learner_ID = LatestHistoryTable.Learner_ID 
     AND LatestHistoryTable.RowN = 1 
+0

おかげ@Kannan - 私はそれがどのように動作するかは考えてきませんが、それがありませんの! (DateStartで 'as LatestHistory'エイリアスを削除しなくてはいけませんでしたが) –

+0

Row_Number()DateStartに基づいて降順の数値を取得し、最新の関連する詳細である最初のものを選択しています... –

関連する問題