PL/SQL查找不同行中开始日期和结束日期之间的差异

PL/SQL查找不同行中开始日期和结束日期之间的差异,sql,oracle,date,plsql,Sql,Oracle,Date,Plsql,我试图使用PL/SQL在结果集中的不同行中查找开始日期和结束日期之间的差异。以下是一个例子: ID TERM START_DATE END_DATE 423 201420 26-AUG-13 13-DEC-13 423 201430 21-JAN-14 09-MAY-14 423 201440 16-JUN-14 07-AUG-14 对于任何特定的ID,我需要获得第一条记录中的结束日期和第二条记录的开始日期之间的差值。类似地,我需要

我试图使用PL/SQL在结果集中的不同行中查找开始日期和结束日期之间的差异。以下是一个例子:

ID    TERM    START_DATE  END_DATE

423   201420    26-AUG-13   13-DEC-13

423   201430    21-JAN-14   09-MAY-14

423   201440    16-JUN-14   07-AUG-14
对于任何特定的ID,我需要获得第一条记录中的结束日期和第二条记录的开始日期之间的差值。类似地,我需要得到第二条记录的结束日期和第三条记录的开始日期之间的差值,依此类推。
最终,我将需要在各种ID上执行相同的操作。我假设我必须使用游标和循环


如果您能为我提供帮助或建议,我将不胜感激。提前感谢。

我建议使用Oracle的LEAD和LAG分析函数。听上去,它们应该适合你的需要


请参阅此处的文档:

我建议您使用Oracle的LEAD和LAG分析功能。听上去,它们应该适合你的需要

请参阅此处的文档:

代码:

SELECT [ID], [TERM], [START_DATE], [END_DATE],
       CASE WHEN MIN([END_DATE]) OVER(PARTITION BY [ID] ORDER BY [TERM] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)=[END_DATE] THEN NULL ELSE
       MIN([END_DATE]) OVER(PARTITION BY [ID] ORDER BY [TERM] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)-[START_DATE] END AS [DAYS_BETWEEN]
FROM [TABLE]
代码:

可以从后续行中获取一个值作为当前行中的值

select id, term, start_date, end_date,
       lead(start_date) over (partition by id order by term) - end_date diff_in_days
from your_table;
给定从查询返回的一系列行和光标的位置,LEAD提供对位于该位置之外的给定物理偏移处的行的访问

这里,此SQL从下一行获取
start\u date
,并从当前行减去
end\u date

select id, term, start_date, end_date,
       lead(start_date) over (partition by id order by term) - end_date diff_in_days
from your_table;
样本输出:

        ID TERM       START_DATE           END_DATE             DIFF_IN_DAYS
---------- ---------- -------------------- -------------------- ------------
       423 201420     26-AUG-2013 00:00:00 13-DEC-2013 00:00:00           39
       423 201430     21-JAN-2014 00:00:00 09-MAY-2014 00:00:00           36
       423 201440     14-JUN-2014 00:00:00 07-AUG-2014 00:00:00
可以从后续行中获取一个值作为当前行中的值

select id, term, start_date, end_date,
       lead(start_date) over (partition by id order by term) - end_date diff_in_days
from your_table;
给定从查询返回的一系列行和光标的位置,LEAD提供对位于该位置之外的给定物理偏移处的行的访问

这里,此SQL从下一行获取
start\u date
,并从当前行减去
end\u date

select id, term, start_date, end_date,
       lead(start_date) over (partition by id order by term) - end_date diff_in_days
from your_table;
样本输出:

        ID TERM       START_DATE           END_DATE             DIFF_IN_DAYS
---------- ---------- -------------------- -------------------- ------------
       423 201420     26-AUG-2013 00:00:00 13-DEC-2013 00:00:00           39
       423 201430     21-JAN-2014 00:00:00 09-MAY-2014 00:00:00           36
       423 201440     14-JUN-2014 00:00:00 07-AUG-2014 00:00:00
这似乎奏效了:

选择DISTINCT
身份证件
术语代码,
学期开始日期,
学期结束日期,
((LEAD(期限开始日期,1)OVER(按ID顺序划分,按期限代码划分))-期限结束日期为不同天数
从桌子上

这似乎有效:

选择DISTINCT
身份证件
术语代码,
学期开始日期,
学期结束日期,
((LEAD(期限开始日期,1)OVER(按ID顺序划分,按期限代码划分))-期限结束日期为不同天数
从桌子上


您可能可以直接用SQL完成这项工作,但您的问题还不清楚。请说明您期望的输出是什么。什么是“第一”列?请具体说明。如何确定您想要的开始和结束日期?更重要的是,是什么决定了记录的顺序?我想是
术语
,但这需要确认。如果我能用直接SQL完成,我希望看到一个DIFF_in_DAYS列,其中包含以天为单位的差异。记录按ID排序,ID的术语按升序排列。最早的术语是201420术语,最晚的术语是201440术语。我需要从最早的术语开始,计算结束日期,并计算到下一个术语开始的天数。您可能可以直接用SQL进行此操作,但您的问题不清楚。请显示您的答案预期为输出。“第一”是什么列?请具体说明。如何确定您想要的开始和结束日期?更重要的是,是什么决定了记录的顺序?我想是
术语
,但这需要确认。如果我能用直接SQL完成,我希望看到一个DIFF_in_DAYS列,其中包含以天为单位的差异。记录按ID排序,ID的术语按升序排列。最早的术语是201420术语,最晚的术语是201440术语。我需要从最早的术语开始,计算结束日期,计算到下一个术语开始的天数。我正要发布相同的内容…但我想你需要“按ID划分”如果我正确理解了这个问题,请看这里。@WumpusQ.Wumbley你说的对。这个问题确实提到了“对于任何特定的ID”,所以我会按ID添加一个分区。谢谢你的提示。我认为这应该可以用,尤其是分区方式。我正要发布同样的东西……但我想你想要一个“按ID分区”如果我没弄错的话,在这里。@WumpusQ.Wumbley你是对的。这个问题提到“任何特定的ID”,因此我将添加一个按ID划分的分区。感谢您的提示。我认为这应该可以工作,尤其是使用分区方式。感谢您的建议和链接。我将查看LEAD和LAG分析函数,以了解如何实现这一点。我想我应该按照Targetman的回答提供一个示例!:OThank you for the建议和link。将检查超前和滞后分析函数,以了解如何实现这一点。我想我应该按照Targetman的回答提供一个示例!:O