为每位员工获取最后的文凭

时间:2019-12-04 15:45:20

标签: sql-server

我想为每位员工获得最后的文凭:

SELECT * FROM (SELECT e.employeeid,afd.AdminFileId ,afd.Title,ss.Name,YearObtained,afd.CreateDate,
ROW_NUMBER() OVER (PARTITION BY afd.AdminFileId ORDER BY afd.CreateDate desc) AS rn
FROM AF_Degree afd
LEFT JOIN AF_AdminFile aaf ON afd.AdminFileId = aaf.AdminFileId
LEFT JOIN schools_School ss ON afd.SchoolId = ss.ID
LEFT JOIN employee e ON e.adminfileid=aaf.AdminFileId) AS D WHERE D.employeeid=109

以上查询的结果: EmployeeId = 109的情况:

employeeid  AdminFileId Title                                                   School                                  YearObtained    CreateDate
107         149971      Intercambio universitario; Programa Erasmus ( meses)    Universidad Politécnica de Cartagena    2008            2018-05-14 03:45:41.6436995
107         149971      Student exchange                                        Umeå University                         2008            2018-06-27 16:01:53.8213765
107         149971      Erasmus Program (12months)                              POLITECNICA CARTAGENA                   2006            2018-06-27 16:01:53.8213765

EmployeeId = 139的情况:

employeeid  AdminFileId Title                                                   School                                   YearObtained   CreateDate
139         145555      Electronic Business Engineering                         Czech University of Life Sciences Prague 2007           2018-05-14 03:45:41.6436995
139         145555      Entrepreneurship and Management                         Umeå University                          2009           2015-06-23 17:30:31.3100000
139         145555      Ingeniería técnica en informática de gestión            Czech University of Life Sciences Prague 2009           2015-06-23 17:30:31.3100000

对于EmoloyeeId = 109,预期结果是:

EmployeeId  AdminFileId Title               School          YearObtained  CreateDate
107         149971      Student exchange    Umeå University 2008          2018-06-27 16:01:53.8213765

对于EmoloyeeId = 139,预期结果是:

EmployeeId AdminFileId Title                                                      
139        7198        Ingeniería técnica en informática de gestión     Czech University of Life Sciences Prague    2009    2015-06-23 17:30:31.3100000

如何获得基于YearObtained和CreateDate为雇员获得的最新文凭,尤其是当我们在同一年拥有两个文凭并且具有相同的CreateDate时(如上述两种情况及其相关的预期输出)?

1 个答案:

答案 0 :(得分:2)

只需将WHERE d.rn = 1添加到外部查询中即可。还可能需要将分区稍微更改为... ORDER BY YearObtained DESC, afd.CreateDate DESC)...

SELECT * 
FROM (
     SELECT e.employeeid,afd.AdminFileId ,afd.Title,ss.Name,YearObtained,afd.CreateDate,
     ROW_NUMBER() OVER (PARTITION BY afd.AdminFileId ORDER BY afd.CreateDate desc) AS rn
     FROM AF_Degree afd
     LEFT JOIN AF_AdminFile aaf ON afd.AdminFileId = aaf.AdminFileId
     LEFT JOIN schools_School ss ON afd.SchoolId = ss.ID
     LEFT JOIN employee e ON e.adminfileid=aaf.AdminFileId
) AS D 
WHERE d.rn = 1

那将使您排成一行。但是,如果YearObtainedCreateDate相同,则不能保证会得到哪条记录。您可能需要在分区的ORDER BY中添加第三列,例如ID或唯一的内容。