解决数据的最佳方法是什么?

时间:2019-06-21 20:30:01

标签: oracle

我正在尝试这样显示数据:
在我们的数据库中,我们有事件(具有唯一ID),然后是开始日期。这些事件不会重叠,并且每个事件都在最后一个事件结束的日期开始。但是,数据库中没有“结束日期”。
我必须将数据输入另一个系统,以便它显示事件ID,开始日期和结束日期(仅是下一个开始日期)。

我想避免创建自定义视图,因为在此数据库中确实对此不满意。所以我想知道是否有一个很好的方法可以在查询中执行此操作。

基本上应该是:
EventA |日期1 |日期2
活动B |日期2 |日期3
EventC |日期3 | Date4

这些活动是提前几年计划的,我只需要在接下来的几个月中进行查询,因此不必担心用完“下一个事件开始日期”的情况,如果需要,此查询将是网络服务调用。

事件和日期的基本伪代码为:

select Event.ID, Event.StartDate
from Event
where Event.StartDate > sysdate and Event.StartDate < sysdate+90

基本上,我想获取下一行的Event.StartDate并将其作为当前行的Event.EndDate

1 个答案:

答案 0 :(得分:0)

使用LEAD分析函数:

Oracle设置

具有10行的表:

CREATE TABLE Event ( ID, StartDate ) AS
  SELECT LEVEL, TRUNC( SYSDATE ) + LEVEL
  FROM   DUAL
  CONNECT BY LEVEL <= 10;

查询

select ID,
       StartDate,
       LEAD( StartDate ) OVER ( ORDER BY StartDate ) AS EndDate
from   Event
where  StartDate > sysdate and StartDate < sysdate+90

输出

ID | STARTDATE | ENDDATE  
-: | :-------- | :--------
 1 | 22-JUN-19 | 23-JUN-19
 2 | 23-JUN-19 | 24-JUN-19
 3 | 24-JUN-19 | 25-JUN-19
 4 | 25-JUN-19 | 26-JUN-19
 5 | 26-JUN-19 | 27-JUN-19
 6 | 27-JUN-19 | 28-JUN-19
 7 | 28-JUN-19 | 29-JUN-19
 8 | 29-JUN-19 | 30-JUN-19
 9 | 30-JUN-19 | 01-JUL-19
10 | 01-JUL-19 | null     

db <>提琴here