2011-11-01 46 views
0

另一个记录我有产生像这样的数据的视图:修改数据以反映在同一组

---ID-------StartDate---EndDate----Endpoint number-------    
G002S6YE 01/06/2011 31/05/2013 1012427316307 
G002W1AY 27/06/2011 30/09/2012 1012427316307 

Endpoint number通常不同为每个记录。在某些情况下,然而它不是(如本例中),我需要修改较早记录的一天的EndDateStartDate之前对以后的记录,因此在这个例子中,数据应显示为:

---ID-------StartDate---EndDate----Endpoint number-------    
G002S6YE 01/06/2011 26/06/2011 1012427316307 
G002W1AY 27/06/2011 30/09/2012 1012427316307 

这完全基于Endpoint number,因此每个记录的StartDateEndDate不重叠。

这是创建视图的实际脚本的简化版本,但是如果您可以显示一个简单的方法来实现我在此处解释的内容,将会非常感激。

+1

“早期”记录是由最早的开始日期确定的_solely_?如果有3条记录具有相同的'endpoint_number',会发生什么情况? –

+0

@ X-Zero - 嗯,我基本上需要确保日期不重叠 –

+0

哦,如果这是一个视图(没有完全捕捉到这个,内在),原始表定义/视图脚本是什么?我们可以通过引用基表来解决这个问题的更好的方法(并且视图内的视图有时会被忽视)。 –

回答

2

所以,你已经有了一个视图V:

SELECT id, startdate, enddate, endpt 
    FROM ... 

您可以修改这是这样的:

SELECT id, startdate 
    , CASE WHEN nextdt IS NULL THEN enddate ELSE nextdt - 1 END enddate, endpt 
    FROM (SELECT id, startdate, enddate, endpt 
      , LEAD(startdate) OVER (PARTITION BY endpt ORDER BY startdate) nextdt 
      FROM ...) 

一个简单的例子,使用表T,而不是一个视图,您的数据加上第三行,以说明X-Zero评论确定的情况。它可能不是你想要的,所以要小心。该查询会给你enddate减去下一个记录。

SQL> CREATE TABLE t (ID VARCHAR2(10), sd DATE, ed DATE, ep NUMBER); 

Table created 
SQL> INSERT INTO t VALUES ('G002S6YE',to_date('01/06/2011','DD/MM/YYYY'), to_date('31/05/2013','DD/MM/YYYY'), 1012427316307); 

1 row inserted 
SQL> INSERT INTO t VALUES ('G002W1AY',to_date('27/06/2011','DD/MM/YYYY'), to_date('30/09/2012','DD/MM/YYYY'), 1012427316307); 

1 row inserted 
SQL> INSERT INTO t VALUES ('G002W1AX',to_date('29/06/2011','DD/MM/YYYY'), to_date('30/06/2012','DD/MM/YYYY'), 1012427316307); 

1 row inserted 

SQL> SELECT id, sd 
    2  , CASE WHEN nextdt IS NULL THEN ed ELSE nextdt - 1 END ed, ep 
    3 FROM (SELECT id, sd, ed, ep 
    4    , LEAD(sd) OVER (PARTITION BY ep ORDER BY sd) nextdt 
    5   FROM t); 

ID   SD   ED     EP 
---------- ----------- ----------- ---------- 
G002S6YE 1/6/2011 26/6/2011 1012427316 
G002W1AY 27/6/2011 28/6/2011 1012427316 
G002W1AX 29/6/2011 30/6/2012 1012427316