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()
函数,使用这些函数我可以接收数字和日期,但不能使用参数 - 所以不能提供“日期不为空”检查。
您可以使用 lag
和 lead
来查找上一行和下一行,然后用另一个查询包装该查询,该查询 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
我有 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()
函数,使用这些函数我可以接收数字和日期,但不能使用参数 - 所以不能提供“日期不为空”检查。
您可以使用 lag
和 lead
来查找上一行和下一行,然后用另一个查询包装该查询,该查询 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