Sql server 根据表中一个字段的最大值,从一个表中选择多个列
我在这个问题上搜索了很久,得到了很多答案,这些答案似乎回答了我提出的问题,但也许我只是没有“得到”它。我似乎无法将答案应用于我的特定问题 我有一个查询,其中列出了我们所有的学习者,并提取了他们所有的历史记录(4种类型),如果他们没有,则显示Sql server 根据表中一个字段的最大值,从一个表中选择多个列,sql-server,Sql Server,我在这个问题上搜索了很久,得到了很多答案,这些答案似乎回答了我提出的问题,但也许我只是没有“得到”它。我似乎无法将答案应用于我的特定问题 我有一个查询,其中列出了我们所有的学习者,并提取了他们所有的历史记录(4种类型),如果他们没有,则显示NULL: select LEARNERS.Learner_ID , LEARNERS.Firstname , LEARNERS.Surname , HISTORY.DateStart , HISTORY
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
...
但是这给了我一个关于GROUPBY子句中的文本字段的错误:o(
我决定只需将HistoryID
字段添加到子查询外部的HISTORY
表中,然后将该字段添加到internal 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
...
但所做的只是为每个学员生成多行代码(类似于我最初的查询),所以现在我被难住了
我相信对于一个有经验的SQL程序员来说,这是一件简单的事情,因为它必须出现很多次,但我仍在学习,所以我恐怕有点卡住了
谢谢,
Alan您可以使用以下行编号和描述:
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上最新的历史记录
别名)Row_Number()获取基于DateStart的降序数,我正在选择第一个,它是最新的和相关的详细信息。。。