在 SQL Server 2018 中使用 Lag() 忽略空值

Ignoring Nulls using Lag() in SQL Server 2018

我正在尝试获取链接到 Dispatch 的 Activity ID。在数据中 Attrib_43 只有在创建 Dispatch 时才会被填充。

我想要做的是在 Dispatch 创建之前获取前一行的 Activity ID。

附件是我正在使用的代码

 Select  sea.ROW_ID, sea.CREATED_DTTM,sea.SRA_SR_ID,sea.ATTRIB_43, tsk.CRT_DTS, tsk.TASK_DESC, datediff(ss,sea.CREATED_DTTM, tsk.CRT_DTS) as dd 

, seal.x_isp_notes, seal.x_isp_comments, seal.comments, seal.x_isp_agent_desc

, tsk.TASK_SUB_TYPE_CD, tsk.TASK_TYPE_CD, tsk.WHAT_ID

, cdl.ORIGIN_NM
,LAG(sea.ROW_ID,1) over (partition by sea.ATTRIB_43 order by sea.CREATED_DTTM) AS 'FLAGID'

--, tsk.*,

, fdc.FISCAL_QUARTER

from GSEDATA.dbo.X_ISP_EXTRNL_CASE_ID sea

join rawdata.corp_ww.FISCAL_DAY_CALENDAR fdc on sea.CREATED_DATE = fdc.ACTUAL_DATE

left join rawdata.svc_base.SFDC_TASK_DTL tsk on sea.X_ISP_EXTRNL_CASE_ID = tsk.TASK_ID

left join rawdata.svc_base.SFDC_CASE_DTL cdl on cdl.case_id = tsk.what_id

left join GSEDATA.dbo.s_evt_act_logs seal on sea.ROW_ID = seal.row_id

where --sea.ATTRIB_43 = '04391481876'
sea.SRA_SR_ID = 'A-2Q7YF57W'

order by sea.CREATED_DTTM

但它没有按照我的期望工作 - Activity Attrib 43 的 ID 标志为 Null

如果我对你的问题的理解正确,你会得到 null FLAGID for non- null attrib_43 because you are using a partition by sea.ATTRIB_43 clause. 分区依据将查询结果集划分为分区。 window 函数分别应用于每个分区,并为每个分区重新开始计算。 这就是为什么 ATTRIB_43 的空值被分组为一个 window 而非空 ATTRIB_43 将有一个单独的 window 用于每个不同的值,因此给出 NULL for LAG() function in the first row of each window. 如果您想要所有行的滞后值,您应该删除子句 partition by sea.ATTRIB_43

LAG(sea.ROW_ID,1) over (order by sea.CREATED_DTTM) AS 'FLAGID'