SQL - 如何选择特定列中具有最大值的数据行? [第2部分]

问题描述 投票:2回答:1

这是一个continuation from my earlier question

计划使用多个连接语句创建视图。我准备好组装各个组件:

select A.[Course Code], A.[Course Title],A.Result, A.[Employee No], A.[Employee Name], A.Section,
   max(B.ActStartDate) as [Last Training Date], B.ValidTo as [Validity Period], A.[Status], A.Flag as [Record Flag]
from

(select c.CourseID, c.[CourseCode] as [Course Code], c.[CourseTitle] as [Course Title],
  c.[CourseCode] + ' - ' + c.[CourseTitle] as [Result],
  b.[EMPLOYEE_NO] as [Employee No], b.[EMPLOYEE_NAME] as [Employee Name],
  b.[SECTION_CODE] + ' - ' + b.[SECTION_DESCRIPTION] as [Section], b.[EMPLOYEE_STATUS] as [Status], a.Flag
from [SQLDB3].[dbo].[ZOJT_EMP_COURSE] a inner join 
[SQLDB3].[dbo].[vEMPLOYEE_PROFILE] b on a.Employee_No = b.EMPLOYEE_NO inner join
[SQLDB3].[dbo].[tTMS_Course] c on c.CourseCode = a.CourseCode) as A

inner join

(select a.SchID as [SchID],  b.CourseID as [CourseID], a.EmpNo as [EmpNo], 
b.ActStartDate as [ActStartDate], a.ValidTo as [ValidTo]
from [SQLDB3].[dbo].[tTMS_Training_Record] a 
inner join

(select z.schid, z.CourseID as [CourseID],max(z.ActStartDate) as [ActStartDate]
from [SQLDB3].[dbo].[tTMS_Training_Schedule] z group by z.SchID, z.CourseID)as b
on a.SchID = b.SchID )as B on A.[Employee No]= B.EmpNo

group by A.CourseID, A.[Course Code], A.[Course Title],A.Result, A.[Employee No], A.[Employee Name], A.Section,
     B.ValidTo, A.[Status], A.Flag

每个课程代码和员工无组合在表格中只有1行条目,最大培训日期的最大值。

虽然这些组件可以单独使用,但在组合时,我会获得相同课程代码和员工编号的多个记录,并且具有不同的上次培训日期。

老实说,我站在这里。有帮助吗?

sql sql-server tsql
1个回答
1
投票

使用row_number窗口函数

   with cte as 

       ( select A.[Course Code], 
                A.[Course Title],
                A.Result, 
                A.[Employee No],
               A.[Employee Name], A.Section,
               B.ActStartDate as [Last Training Date],
               B.ValidTo as [Validity Period],
               A.[Status], A.Flag as [Record Flag]
,row_number() over(partition by A.[Course Code], A.[Employee No] order by B.ActStartDate desc) rn
    from

    (select c.CourseID, c.[CourseCode] as [Course Code], c.[CourseTitle] as [Course Title],
      c.[CourseCode] + ' - ' + c.[CourseTitle] as [Result],
      b.[EMPLOYEE_NO] as [Employee No], b.[EMPLOYEE_NAME] as [Employee Name],
      b.[SECTION_CODE] + ' - ' + b.[SECTION_DESCRIPTION] as [Section], b.[EMPLOYEE_STATUS] as [Status], a.Flag
    from [SQLDB3].[dbo].[ZOJT_EMP_COURSE] a inner join 
    [SQLDB3].[dbo].[vEMPLOYEE_PROFILE] b on a.Employee_No = b.EMPLOYEE_NO inner join
    [SQLDB3].[dbo].[tTMS_Course] c on c.CourseCode = a.CourseCode) as A

    inner join

    (select a.SchID as [SchID],  b.CourseID as [CourseID], a.EmpNo as [EmpNo], 
    b.ActStartDate as [ActStartDate], a.ValidTo as [ValidTo]
    from [SQLDB3].[dbo].[tTMS_Training_Record] a 
    inner join

    (select z.schid, z.CourseID as [CourseID],max(z.ActStartDate) as [ActStartDate]
    from [SQLDB3].[dbo].[tTMS_Training_Schedule] z group by z.SchID, z.CourseID)as b
    on a.SchID = b.SchID )as B on A.[Employee No]= B.EmpNo
    ) select * from cte where rn=1
© www.soinside.com 2019 - 2024. All rights reserved.