2017-05-03 257 views
0

我一直在尋找這個人的年齡,並得到很多答案似乎回答了問題的問題,但也許我只是沒有'得到'它。我似乎無法將答案應用於我的特定問題。從表格中選擇一個表格中的多個列表

我有一個查詢,列出所有的學習者和拉他們所有的歷史記錄(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(

我決定,我只想添加HistoryID場,然後INNER JOIN是到HISTORY表外的子查詢的拉,我需要其他字段:

... 
(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 
... 

,但是所做的只是爲每個學習者生成多行(類似於我的原始查詢),所以現在我難倒了。

我確信這對於一個有經驗的SQL編碼器來說是一件簡單的事情,因爲它必須出現很多次,但我仍然在學習,所以我有點卡住了。

謝謝你,艾倫

回答

0

您可以使用ROW_NUMBER和如下說明:

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得到降序號碼,我選擇了第一個是最新的和相關的細節...... –

相關問題