【问题标题】:LAG and LEAD based on parameter基于参数的 LAG 和 LEAD
【发布时间】:2022-01-22 07:24:23
【问题描述】:

我有表格 - 发票,结构如下:

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() 函数,使用这些函数我可以接收数字和日期,但不能使用参数 - 所以不能提供“日期不为空”检查。

【问题讨论】:

  • 你解释一下这个输出背后的逻辑吗?
  • 你能不能展示一下你到目前为止所做的尝试。
  • @Mureinik 如果当前行的上一条或下一条记录在“日期”字段中包含 null - 我应该返回这一行。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql lag lead


【解决方案1】:

您可以使用laglead 查找上一行和下一行,然后用另一个查询包装查询,该查询仅返回其中一个为null 的行。注意第一行的lag和最后一个raw的lead默认会返回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

【讨论】:

  • 好答案,谢谢!但是如果我有一种情况 - 连续两个 Date = null 怎么办?当前的解决方案也显示了它们,并且条件不起作用:(我尝试将“日期不为空”添加到内部查询,并且外部也是
  • 更新了描述
  • 天哪,我忘了括号 - 工作正常,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2021-08-19
  • 1970-01-01
相关资源
最近更新 更多