Sql 修改数据以反映同一组中的另一条记录

Sql 修改数据以反映同一组中的另一条记录,sql,oracle,views,toad,Sql,Oracle,Views,Toad,我有一个视图,它生成如下数据: ---ID-------StartDate---EndDate----Endpoint number------- G002S6YE 01/06/2011 31/05/2013 1012427316307 G002W1AY 27/06/2011 30/09/2012 1012427316307 每个记录的端点编号通常不同。但是,在某些情况下(如本例),我需要将早期记录的EndDate修改为后一条记录的StartDat

我有一个视图,它生成如下数据:

---ID-------StartDate---EndDate----Endpoint number-------             
G002S6YE    01/06/2011  31/05/2013  1012427316307
G002W1AY    27/06/2011  30/09/2012  1012427316307
每个记录的端点编号通常不同。但是,在某些情况下(如本例),我需要将早期记录的
EndDate
修改为后一条记录的
StartDate
的前一天,因此在本例中,数据应显示为:

---ID-------StartDate---EndDate----Endpoint number-------             
G002S6YE    01/06/2011  26/06/2011  1012427316307
G002W1AY    27/06/2011  30/09/2012  1012427316307
这完全基于端点编号
,因此每条记录的开始日期和结束日期不会重叠


这是创建视图的实际脚本的一个非常简化的版本,但是如果您能展示一种实现我在这里解释的内容的简单方法,我们将不胜感激。

因此,您有一个视图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减去1的结果


“较早”记录仅由最早的开始日期确定?如果有3条记录具有相同的
endpoint\u编号
?@X-Zero-我基本上需要确保日期不重叠哦,如果这是一个视图(最初没有完全捕捉到),那么原始的表定义/视图脚本是什么?我们可能有更好的方法通过引用基表来解决这个问题(视图中的视图有时是不受欢迎的)。
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