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