2017-02-09 171 views
0

输入集,将记录日期和结束日期

CMP BND_CD STARTDATE ENDDATE 
01 UF  03/15/2010 07/01/2010 
01 TRL 03/15/2010 12/15/2014 

伪数据

CREATE TABLE DATA (CMP, BND_CD, STARTDATE, ENDDATE) AS 
    SELECT '01','UF', DATE '2010-03-15', DATE '2010-07-01' FROM DUAL UNION ALL 
    SELECT '01','TRL', DATE '2010-03-15', DATE '2010-12-15' FROM DUAL; 

我需要的输出作为3个记录,该分裂TRL/UF的记录,即,

CMP BND_CD STARTDATE ENDDATE 
01 UF  03/15/2010 07/01/2010 
01 TRL 03/15/2010 07/01/2010 
01 TRL 07/01/2010 12/15/2014 

如果日期范围相互重叠,则应该为两个BND_CD的每个CMP代码进行拆分。我们必须根据C MP值,那么如果TRL与UF重叠,TRL索引应该被分割,或者如果UFoverlaps TRL,UF记录应该被分割。

+0

如果你有更多的行,为exampe另一行有开始/结束= 04/01/2010 - 08/01/2010? – Aleksej

+0

@Aleksej然后我们应该创建一个更多的间隔,作为一个新的记录。我们必须根据CMP值对记录进行分组,然后如果TRL与UF重叠,TRL索引应该被分割,或者如果UFoverlaps TRL,UF记录应该被分割。 –

+0

@Aleksej如果04/01/2010 - 08/01/2010作为TRL记录添加,则用友应在2010年3月15日 - 2010年4月1日,04/01/2010-07/01/2010。或者如果04/01/2010 - 08/01/2010作为用友记录添加,则TRL应在2010年3月15日 - 2010年4月1日,2010年4月1日/ 2010年7月1日/ 2010年/ -07/01/2010-08/01/2010,08/01/2010-12/15/2014年 –

回答

1

查询

SELECT u.cmp,   -- UF values preceding the TRL range 
     u.bnd_cd, 
     u.start_date, 
     LEAST(u.end_date, t.start_date) 
FROM data t 
     INNER JOIN 
     data u 
     ON ( t.bnd_cd = 'TRL' 
      AND u.bnd_cd = 'UF' 
      AND t.cmp = u.cmp 
      AND u.start_date < t.start_date) 
UNION ALL 
SELECT u.cmp,   -- UF values within the TRL range 
     u.bnd_cd, 
     GREATEST(u.start_date, t.start_date), 
     LEAST(u.end_date, t.end_date) 
FROM data t 
     INNER JOIN 
     data u 
     ON ( t.bnd_cd = 'TRL' 
      AND u.bnd_cd = 'UF' 
      AND t.cmp = u.cmp 
      AND u.start_date <= t.end_date 
      AND u.end_date >= t.start_date) 
UNION ALL 
SELECT u.cmp,   -- UF values following the TRL range 
     u.bnd_cd, 
     GREATEST(u.start_date, t.end_date), 
     u.end_date 
FROM data t 
     INNER JOIN 
     data u 
     ON ( t.bnd_cd = 'TRL' 
      AND u.bnd_cd = 'UF' 
      AND t.cmp = u.cmp 
      AND u.end_date > t.end_date) 
UNION ALL 
SELECT t.cmp,   -- TRL values preceding the UF range 
     t.bnd_cd, 
     t.start_date, 
     LEAST(t.end_date, u.start_date) 
FROM data t 
     INNER JOIN 
     data u 
     ON ( t.bnd_cd = 'TRL' 
      AND u.bnd_cd = 'UF' 
      AND t.cmp = u.cmp 
      AND t.start_date < u.start_date) 
UNION ALL 
SELECT t.cmp,   -- TRL values within the UF range 
     t.bnd_cd, 
     GREATEST(t.start_date, u.start_date), 
     LEAST(t.end_date, u.end_date) 
FROM data t 
     INNER JOIN 
     data u 
     ON ( t.bnd_cd = 'TRL' 
      AND u.bnd_cd = 'UF' 
      AND t.cmp = u.cmp 
      AND t.start_date <= u.end_date 
      AND t.end_date >= u.start_date) 
UNION ALL 
SELECT t.cmp,   -- TRL values following the UF range 
     t.bnd_cd, 
     GREATEST(t.start_date, u.end_date), 
     t.end_date 
FROM data t 
     INNER JOIN 
     data u 
     ON ( t.bnd_cd = 'TRL' 
      AND u.bnd_cd = 'UF' 
      AND t.cmp = u.cmp 
      AND t.end_date > u.end_date) 

输出

CMP BND_CD START_DATE END_DATE 
--- ------ ---------- ---------- 
01 UF  2010-03-15 2010-07-01 
01 TRL 2010-03-15 2010-07-01 
01 TRL 2010-07-01 2010-08-01 
相关问题