gpt4 book ai didi

sql - SQL 中的累积日期

转载 作者:行者123 更新时间:2023-12-03 02:38:10 26 4
gpt4 key购买 nike

我有这个包含示例数据的表格:

声明@Sample TABLE(fill_date DATETIME,days_supplied INT)

INSERT INTO @Sample (fill_date, days_supplied)
VALUES (
'02/17/2005', --> DATEADD(dd, 500, '02/17/2005') = '07/02/2006'
500
),
(
'06/13/2005', --> DATEADD(dd, 30, '07/02/2006') = '08/01/2006'
30
),
(
'08/11/2005', --> DATEADD(dd, 30, '08/01/2006') = '08/31/2006'
30
)

我需要将 days_supplied 添加到第一行的 fill_date 中,即 2006-07-02。如果结果高于下一行的 fill_date,我需要将下一行的 days_supplies 添加到上一行的 days_supplied 和 fill_date 之和中。如果第一行的结果不高于下一行的 fill_date,那么我需要添加下一行的 days_supplied 和 fill_date,依此类推。

这就是我最终需要的结果:

last_fill_date:'08/31/2006'。

实现这一目标的最佳方法是什么?感谢任何帮助

最佳答案

对于这种类型的逻辑,您需要使用递归 CTE ——唉:

with s as (
select s.*, row_number() over (order by fill_date) as seqnum
from sample s
),
cte as (
select fill_date, days_supplied, dateadd(day, days_supplied, fill_date) as end_date, seqnum
from s
where seqnum = 1
union all
select (case when s.fill_date > cte.end_date then s.fill_date else cte.end_date end),
s.days_supplied,
dateadd(day, s.days_supplied, (case when s.fill_date > cte.end_date then s.fill_date else cte.end_date end)),
s.seqnum
from cte join
s
on s.seqnum = cte.seqnum + 1
)
select max(end_date)
from cte;

Here是一个数据库<> fiddle 。

请注意,这个问题有一点含糊之处。我认为行是按 fill_date 排序的,这就是这个答案所假设的。

关于sql - SQL 中的累积日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54641106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com