将前一个值设置为 NULL 用于 LEAD 功能
Posted
技术标签:
【中文标题】将前一个值设置为 NULL 用于 LEAD 功能【英文标题】:Set previous value as NULL for LEAD function 【发布时间】:2019-11-20 09:32:44 【问题描述】:我有以下查询来获取具有 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
【问题讨论】:
一个简单的CASE WHEN LocationDate IS NOT NULL THEN LEAD()... END
就可以了。
【参考方案1】:
只需将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,
【讨论】:
以上是关于将前一个值设置为 NULL 用于 LEAD 功能的主要内容,如果未能解决你的问题,请参考以下文章