我试图使用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执行相同的操作。我假设我必须使用游标和循环。
对于完成此任务有任何帮助或建议,我将不胜感激。提前谢谢。
答案 0 :(得分:5)
"lead" analytic function in Oracle可以从后续行中获取值作为当前行中的值。
给定从查询返回的一系列行和光标的位置,LEAD提供对超出该位置的给定物理偏移的行的访问。
此处,此SQL从下一行抓取start_date
并从当前行中减去end_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
答案 1 :(得分:0)
我建议使用Oracle的LEAD和LAG分析函数。听到它的声音,它们应该适合你的需要。
请参阅此处的文档:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions074.htm
答案 2 :(得分:0)
代码:
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]
答案 3 :(得分:0)
这似乎有效:
SELECT DISTINCT
ID,
TERM_CODE,
TERM_START_DATE,
TERM_END_DATE,
( ( LEAD ( TERM_START_DATE, 1 ) OVER ( PARTITION BY ID ORDER BY TERM_CODE ) ) -TERM_END_DATE AS DIFF DAYS
FROM TABLE