将记录日期和结束日期
问题描述:
输入集,将记录日期和结束日期
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记录应该被分割。
答
查询:
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
如果你有更多的行,为exampe另一行有开始/结束= 04/01/2010 - 08/01/2010? – Aleksej
@Aleksej然后我们应该创建一个更多的间隔,作为一个新的记录。我们必须根据CMP值对记录进行分组,然后如果TRL与UF重叠,TRL索引应该被分割,或者如果UFoverlaps TRL,UF记录应该被分割。 –
@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年 –