2017-02-09 177 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 
相關問題