2017-02-09 9 views
0

入力セットをenddateこの、スプリットSTARTDATEに基づいてレコードと

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; 

私は

、すなわち、TRL/UFレコードを分割3つのレコードとして出力し、必要
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 

日付範囲が重複している場合は、2つのBND_CDの各CMPコードごとに分割を実行する必要があります。Cに基づいてレコードをグループ化する必要がありますMP値の場合、TRLがUFと重複する場合、TRLのリワードを分割するか、UFがTRLをオーバーラップする場合、UFレコードを分割する必要があります。

+0

あなたはより多くの行、開始/終了とexampeのための別の行= 2010年4月1日だった場合 - 8月1日を/ 2010? – Aleksej

+0

@Aleksejその後、新しいレコードとしてもう1つの間隔を作成する必要があります。 CMP値に基づいてレコードをグループ化する必要があります。次に、TRLがUFと重複する場合、TRLのリワードを分割するか、UFがTRLをオーバーラップする場合、UFレコードを分割する必要があります。 –

+0

@Aleksej 04/01/2010 - 08/01/2010がTRLレコードとして追加された場合、UFは03/15/2010 - 04/01/2010、04/01/2010-07/01/01の間で分割されます。 2010。または、04/01/2010 - 08/01/2010がUFレコードとして追加された場合、TRLは03/15/2010 - 04/01/2010、04/01/2010-07/01/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 
関連する問題