将LEAD函数的先前值设置为NULL

时间:2019-11-20 09:32:44

标签: sql-server tsql window-functions

我有以下查询,以获取EmployeeId =的员工的位置历史记录:

SELECT
   e.EmployeeId,
   el.EmployeeLocationId,
   oe.OfficeExtensionId,
   oe.Label,
   [of].OfficeId as 'OfficeId',
   [of].Name as 'Office Name',
   el.LocationDate AS LocationStartDate,
   LEAD(el.LocationDate) OVER ( 
ORDER BY
   el.LocationDate) AS LocationEndDate 
FROM
   Employee_Location el 
   LEFT JOIN
      Employee e 
      ON el.EmployeeId = e.EmployeeId 
   LEFT JOIN
      OfficeExtension oe 
      ON el.OfficeExtensionId = oe.OfficeExtensionId 
   INNER JOIN
      Office [of] 
      ON oe.OfficeId = [of].OfficeId 
WHERE
   el.EmployeeId = 5625

这是我的输出:

EmployeeId  EmployeeLocationId  OfficeExtensionId   OfficeExtensionId   Label      LocationDateStart           LocationDateEnd
5625        6265                156                 156                 Romania    NULL                        2019-04-09 08:15:37.9583552
5625        6265                156                 156                 Romania    2019-04-09 08:15:37.9583552 2019-07-02 11:00:24.4420116
5625        6390                83                  83                  Spain      2019-07-02 11:00:24.4420116 NULL

我想在没有LocationDateStart的位置将NULL值设置为LocationDateEnd,所以我的预期输出应如下所示:

EmployeeId  EmployeeLocationId  OfficeExtensionId   OfficeExtensionId   Label      LocationDateStart           LocationDateEnd
5625        6265                156                 156                 Italy      NULL                        NULL
5625        6265                156                 156                 Romania    2019-04-09 08:15:37.9583552 2019-07-02 11:00:24.4420116
5625        6390                83                  83                  Spain      2019-07-02 11:00:24.4420116 NULL

1 个答案:

答案 0 :(得分:2)

只需将LEAD()函数包装在CASE表达式内:

el.LocationDate AS LocationStartDate,
CASE WHEN el.LocationDate IS NOT NULL THEN LEAD(el.LocationDate)
                                           OVER (ORDER BY el.LocationDate)
END AS LocationEndDate,