【问题标题】:Create timeline from overlapping dates从重叠日期创建时间线
【发布时间】: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 的事情)code case 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 end code 我无法让分区窗口按我的意愿工作或区分当前行值和以下行。
  • 一个想法,编辑答案如下。

标签: oracle date range analytics


【解决方案1】:

使用 Oracle 的支点。

Oracle Pivot

select * from
(select emp_id, gtype, amt, start_date, stop_date
from positions)
pivot (sum(amt) as amt for (gtype) in (1 as "TYPE1", 2 as "TYPE2"))
order by emp_id, start_date;

还有更多信息(谢谢),像这样?

select emp_id, gtype, start_date, 
case when next_amt <> amt then next_start_date -1 end as to_date
from
(select emp_id, gtype, start_date, amt,
lead(start_date,1) over (order by emp_id, start_date) next_start_date,
lead(amt,1) over (order by emp_id, start_date) next_amt
from
positions)

【讨论】:

  • 不完全。我需要得出一个时间线,其中包含开始、停止日期以及这两个日期之间的有效金额。将所需输出的第一行与 2010 年 5 月 1 日开始的源日期进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2021-03-26
相关资源
最近更新 更多