从表格中选择一个表格中的多个列表
问题描述:
我一直在寻找这个人的年龄,并得到很多答案似乎回答了问题的问题,但也许我只是没有'得到'它。我似乎无法将答案应用于我的特定问题。从表格中选择一个表格中的多个列表
我有一个查询,列出所有的学习者和拉他们所有的历史记录(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编码器来说是一件简单的事情,因为它必须出现很多次,但我仍然在学习,所以我有点卡住了。
谢谢你,艾伦
答
您可以使用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
感谢@Kannan - 我不知道它是如何工作的,但它确实! (虽然我不得不在DateStart中删除'as LatestHistory'的别名) –
Row_Number()根据DateStart得到降序号码,我选择了第一个是最新的和相关的细节...... –