Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 具有联接的特定年份的最大值_Sql_Sql Server - Fatal编程技术网

Sql 具有联接的特定年份的最大值

Sql 具有联接的特定年份的最大值,sql,sql-server,Sql,Sql Server,我有两张桌子。键都是SID-连接在此键上 第一个表有教育数据。例如,SID,获得了YearQual和QualLevel的年度资格。每个SID可能有几行 第二个表包含事件数据,包括事件年份EventYear和SID 我需要找到的是今年的最高水平 我正在使用SQL Server 我已经编写了一个又一个查询,我可以得到与事件年无关的MAX QualLevel,或者多行显示所有资格级别>=事件年,而我只需要该年的MAX SELECT eventdata.S_ID, eventdata.eventyear

我有两张桌子。键都是SID-连接在此键上 第一个表有教育数据。例如,SID,获得了YearQual和QualLevel的年度资格。每个SID可能有几行

第二个表包含事件数据,包括事件年份EventYear和SID

我需要找到的是今年的最高水平

我正在使用SQL Server

我已经编写了一个又一个查询,我可以得到与事件年无关的MAX QualLevel,或者多行显示所有资格级别>=事件年,而我只需要该年的MAX

SELECT eventdata.S_ID, eventdata.eventyear,
     max (education.qual_Level) as highqual
FROM education
  left join eventdata
  ON education.S_ID = eventdata.S_ID
  WHERE  education.YearQual<= eventyear 
  GROUP BY eventyear, qual_level, eventdata.S_ID
上面的代码给出了多行

我需要找到的是今年的最高水平

如果需要MAX QualLevel和EventYear,请不要在select和group by语句中包含eventdata.S_ID

由于同一事件年有多个S_ID,因此将获得重复记录

更改您的查询,如下所示

SELECT  eventdata.eventyear,
        max (education.qual_Level) as highqual
FROM education
  left join eventdata
  ON education.S_ID = eventdata.S_ID
  WHERE  education.YearQual<= eventdata.eventyear 
  GROUP BY eventdata.eventyear
您可以使用行号


这是一个很好的使用应用程序的地方:

 select S_ID,eventyear,highqual from
(SELECT eventdata.S_ID, eventdata.eventyear,
     education.qual_Level as highqual,
  row_number()over(partition by eventyear order by education.qual_Level desc) rn
FROM education
  left join eventdata
  ON education.S_ID = eventdata.S_ID
  WHERE  education.YearQual<= eventyear 
) t where t.rn=1
SELECT ed.*, e.qual_Level as highqual
FROM eventdata ed OUTER APPLY
     (SELECT TOP (1) ed.*
      FROM education e
      WHERE e.S_ID = ed.S_ID AND
            e.YearQual <= ed.eventyear 
      ORDER BY e.YearQual DESC
     ) ed;