SQL 中的下一个正数日期

Posted

技术标签:

【中文标题】SQL 中的下一个正数日期【英文标题】:Next positive date in SQL 【发布时间】:2021-11-06 05:35:59 【问题描述】:
p_date Qty Available Type
11/04/2021 -1 2 Debit
11/08/2021 -1 1 Debit
11/09/2021 -1 0 Debit
11/15/2021 -1 -1 Debit
11/17/2021 -5 -6 Debit
11/18/2021 -50 -56 Debit
11/18/2021 -3 -59 Debit
11/18/2021 -1 -60 Debit
11/20/2021 10 -50 Credit
11/21/2021 100 50 Credit
11/21/2021 -1 49 Debit
11/24/2021 -62 -13 Debit
11/26/2021 -4 -17 Debit
11/30/2021 -1 -18 Debit

我有一个类似上面的表格,其中“数量”可能是正数或负数,具体取决于“类型”列是“借方”还是“贷方”。

我想编写一个 SQL 查询来向表中添加一个额外的列,如下所示,以在“可用”列变为正数时显示下一个正 p_date。 注意:当'Available'已经为正数时,'Next Positive p_date'列将显示'p_date'列。

p_date Qty Available Type Next Positive p_date
11/04/2021 -1 2 Debit 11/04/2021
11/08/2021 -1 1 Debit 11/08/2021
11/09/2021 -1 0 Debit 11/09/2021
11/15/2021 -1 -1 Debit 11/21/2021
11/17/2021 -5 -6 Debit 11/21/2021
11/18/2021 -50 -56 Debit 11/21/2021
11/18/2021 -3 -59 Debit 11/21/2021
11/18/2021 -1 -60 Debit 11/21/2021
11/20/2021 10 -50 Credit 11/21/2021
11/21/2021 100 50 Credit 11/21/2021
11/21/2021 -1 49 Debit 11/21/2021
11/24/2021 -62 -13 Debit 12/05/2021
11/26/2021 -4 -17 Debit 12/05/2021
11/30/2021 -1 -18 Debit 12/05/2021
12/05/2021 80 62 Credit 12/05/2021

【问题讨论】:

请不要添加垃圾标签,只添加您实际使用的 DBMS 的标签,因为它们都不同。 这能回答你的问题吗? How to make LAG() ignore NULLS in SQL Server? @rain_maker 您使用的是哪个特定的 RDBMS(mysql/Postgresql/Snowflake)? 我正在使用 Snowflake。 @Lukasz 是否可以跟踪使用的数量。如下所示。 ***.com/questions/69865551/… 【参考方案1】:

可以通过LEAD窗口函数实现:

SELECT *, CASE WHEN Available >= 0 THEN p_date
               ELSE LEAD(CASE WHEN Available > 0 THEN p_date END) IGNORE NULLS
                    OVER(ORDER BY p_date)
          END next_p_date
FROM tab
ORdER BY p_date;

工作原理:如果 Available 小于 0,CASE 表达式将 p_date 无效,并且 IGNORE NULLS 会跳过该 p_date(有效地找到第一个可用的正数 p_date)

【讨论】:

以上是关于SQL 中的下一个正数日期的主要内容,如果未能解决你的问题,请参考以下文章

如何获取不在 30 天内的下一个最小日期并用作 SQL 中的参考点?

如何根据 T-SQL (SSMS 2017) 中的下一条记录 [Effective Date]-1 计算到期日期?

如何获取SQL表中的下一条记录

钳位到系列中的下一个最小值

求sql语句 将某列中的正数保持不变,负数取反成为正数

如何使用单击事件和意图将当前日期从一个活动传递到android中的下一个活动