Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据表中一个字段的最大值,从一个表中选择多个列_Sql Server - Fatal编程技术网

Sql server 根据表中一个字段的最大值,从一个表中选择多个列

Sql server 根据表中一个字段的最大值,从一个表中选择多个列,sql-server,Sql Server,我在这个问题上搜索了很久,得到了很多答案,这些答案似乎回答了我提出的问题,但也许我只是没有“得到”它。我似乎无法将答案应用于我的特定问题 我有一个查询,其中列出了我们所有的学习者,并提取了他们所有的历史记录(4种类型),如果他们没有,则显示NULL: select LEARNERS.Learner_ID , LEARNERS.Firstname , LEARNERS.Surname , HISTORY.DateStart , HISTORY

我在这个问题上搜索了很久,得到了很多答案,这些答案似乎回答了我提出的问题,但也许我只是没有“得到”它。我似乎无法将答案应用于我的特定问题

我有一个查询,其中列出了我们所有的学习者,并提取了他们所有的历史记录(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
...
但是这给了我一个关于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的降序数,我正在选择第一个,它是最新的和相关的详细信息。。。