LAG 和 LEAD 基于参数

LAG and LEAD based on parameter

我有 table - 发票,结构如下:

Id InvoiceNo Date
1 10 11-12-21
2 20 12-12-21
3 30 13-12-21
4 40 NULL
5 50 14-12-21
6 60 NULL
7 70 NULL
8 80 15-12-21

我需要做什么 - 我需要找到 InvoiceNo 的下一行或上一行的日期字段包含 null。 因此,根据提供的数据 - 我应该收到:

InvoiceNo
30
50
80

但是如何做到这一点?我发现的一个选项 - LAG()LEAD() 函数,使用这些函数我可以接收数字和日期,但不能使用参数 - 所以不能提供“日期不为空”检查。

您可以使用 laglead 来查找上一行和下一行,然后用另一个查询包装该查询,该查询 return 仅包含其中一个所在的行null。请注意,第一行的 lag 和最后一行的 lead 将默认为 return null,因此您需要明确声明非 null 默认值, 例如 getdate():

SELECT InvoiceNo
FROM   (SELECT InvoiceNo,
               LAG(Date, 1, GETDATE()) OVER (ORDER BY InvoiceNo) AS lag_date,
               LEAD(Date, 1, GETDATE()) OVER (ORDER BY InvoiceNo) AS lead_date
        FROM   invoices) t
WHERE   lag_date IS NULL OR lead_date IS NULL