【发布时间】:2012-05-25 15:24:48
【问题描述】:
鉴于此表:
CREATE TABLE positions
( "EMP_ID" CHAR(10 BYTE),
"GTYPE" NUMBER,
"AMT" NUMBER,
"START_DATE" DATE,
"STOP_DATE" DATE
)
还有这些数据:
Insert Into positions (Emp_Id,Gtype,Amt,Start_Date,Stop_Date)
select 'XA0022',1,1000,'01-MAY-2010','08-MAY-2012' from dual union
Select 'XA0022',1,1000,'01-MAY-2010','31-DEC-2012' From Dual Union
Select 'XA0022',2,500,'03-APR-2012','15-JUL-2012' From Dual Union
Select 'XA0022',1,421,'01-MAY-2012','23-MAY-2012' From Dual Union
Select 'XA0022',1,1514,'09-MAY-2012','31-DEC-2012' From Dual union
select 'XA0022',1,600,'24-MAY-2012','24-MAY-2012' from dual;
我如何做到这一点:
from to type1 type2
01-May-2010 02-Apr-2012 2000 0
03-Apr-2012 30-Apr-2012 2000 500
01-May-2012 07-May-2012 2421 500
08-May-2012 08-May-2012 2421 500
09-May-2012 22-May-2012 2935 500
23-May-2012 23-May-2012 2935 500
24-May-2012 15-Jul-2012 3114 500
16-Jul-2012 31-Dec-2012 3014 0
注意:金额在 start_date 生效,在 stop_date 之后的第二天无效。
感谢您的指点!
【问题讨论】:
-
你能再推断一下吗?我不明白 type1、type2 是如何发挥作用的。
-
我认为 type1、type2 并不是最棘手的部分。我所拥有的源数据是一个带有开始日期和结束日期的表格,其中一些开始/结束日期重叠我需要能够推断出每次职位开始时有效的每种类型的总金额或停止。把它想象成一个时间线。从 2010 年 5 月 1 日到 2010 年 4 月 2 日,总共 type1 = 2000, type2=0 这是因为从 2010 年 5 月 1 日开始有 2 个类型 1,但在 2012 年 4 月 3 日这会更改为 type2开始,所以 type1 = 2000, type2=0 在前一天 02-Apr-12 结束
-
我认为这是我想要的伪代码(暂时忽略 type1,2 的事情)
codecase when least((following_rows.start_date-1),following_rows.end_date) 在 current_row 之间.start_date 和 current_row.stop_date then least((following_rows.start_date-1),following_rows.end_date) else current_row.end_date endcode我无法让分区窗口按我的意愿工作或区分当前行值和以下行。 -
一个想法,编辑答案如下。
标签: oracle date range analytics