将前一个值设置为 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 功能的主要内容,如果未能解决你的问题,请参考以下文章

Hive开窗函数

Hive 分析函数lead、lag实例应用

面试题: LEAD 和 LAG 求每个用户的页面停留时长

面试题: LEAD 和 LAG 求每个用户的页面停留时长

面试题: LEAD 和 LAG 求每个用户的页面停留时长

如何用 Oracle 中应用 Lead() 函数的同一列值替换最后一行中的 NULL?