我在SQL Server 2008中使用了以下代码,但我现在需要在Oracle 10g R2中实现它,它似乎不支持递归CTE。基本上,它将记录分组为每个PID的事件,当旧记录的END_DATE在最新记录的START_DATE的90天内时,两个记录被认为是同一事件(尽管会有更多条件)在最后的实施中)。
这是SQL小提琴:http://sqlfiddle.com/#!3/1840b/3
WITH C AS
(
SELECT PID, START_DATE, END_DATE AS EVENT_START, 1 AS EVENT, RN, END_DATE
FROM SampleTable
WHERE RN=1
UNION ALL
SELECT C.PID, R.START_DATE,
CASE WHEN R.START_DATE < DATEADD(DAY, -90, C.EVENT_START) THEN R.END_DATE ELSE C.EVENT_START END,
CASE WHEN R.START_DATE < DATEADD(DAY, -90, C.EVENT_START) THEN C.EVENT + 1 ELSE C.EVENT END,
R.RN,
R.END_DATE
FROM C INNER JOIN SampleTable R ON C.PID = R.PID and C.RN=R.RN-1
)
任何解决方案都应该没问题,因为它会一次针对一个小的(200,000条记录)数据集运行,尽管我有兴趣看看是否/如何在SQL中使用START WITH ... CONNECT完成此操作BY