2017-05-03 107 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得到降序号码,我选择了第一个是最新的和相关的细节...... –

相关问题