![](/img/trans.png)
[英]Is there any syntax for adding new record between two records in sql table?
[英]How to create a new record for the overlapping period between two records using Informatica/SQL
对于以下源数据,需要为重叠期间创建一个新记录,并且其数量应为重叠记录数量的总和。 现有记录的开始日期和结束日期也需要更改,以使它们不会重叠。
资源 :
ID StartDate EndDate Amount
1 1-Jan 31-Jul 100
1 1-Jun 31-Dec 100
预期产量:
ID StartDate EndDate Amount
1 1-Jan 31-May 100
1 1-Jun 31-Jul 200
1 1-Aug 31-Dec 100
如何使用SQL(IBM DB2)/ Informatica或两者结合使用?
注意:不能使用存储的proc。
开始的地方是拆分数据,因此只有一列带有数量。 我认为这会产生您想要的:
select id, dte as StartDate,
lead(dte) over (partition by id, dte) - 1 day as NextDate,
sum(sum(amount)) over (partition by id order by dte) as amount
from ((select id, startdate as dte, amount
from t
) union all
(select id, enddate + 1 day, - amount
from t
)
) t
group by id, dte;
OLAP函数对将一行与下一行进行比较确实很有帮助。 必须创建一个UNION才能创建其他行。 下面的示例分别处理每种类型的行。
-- normal rows without overlapping
select id, startdate, enddate, amount
from ( select id, startdate, enddate, amount ,
lead(startdate) over (partition by id order by startdate) as nextstart
from t )
where nextstart > enddate
union all
-- overlapping time ranges
-- first intervall
select id, startdate, nextstart - 1 day as enddate, amount
from ( select id, startdate, enddate, amount ,
lead(startdate) over (partition by id order by startdate) as nextstart
from t )
where nextstart < enddate
union all
-- new middle interval
select id, nextstart as startdate, enddate, amount + nextamount
from ( select id, startdate, enddate, amount ,
lead(startdate) over (partition by id order by startdate) as nextstart,
lead(amount) over (partition by id order by startdate) as nextamount
from t )
where nextstart < enddate
union all
-- last interval
select id, prevend + 1 day as startdate, enddate, amount
from ( select id, startdate, enddate, amount ,
lag(enddate) over (partition by id order by startdate) as prevend
from t )
where startdate < prevend
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.