Предположим, что в Oracle 10g, у меня есть таблица вроде этого:Split строки на несколько строк в зависимости от времени
id | start_date | end_date | value | parent_id
----------------------------------------------------
1 | 01-01-2001 | 01-01-2002 | aaaaaa | 3
2 | 01-01-2003 | 01-01-2004 | bbbbbb | 3
3 | 01-01-2000 | 01-01-2005 | cccccc | 4
4 | 01-01-1999 | 01-01-2006 | dddddd |null
Я хотел бы видеть какие-либо пробелы в заполняться родителя без перекрытия. Более конкретно результат должен быть что-то вроде:
start_date | end_date | value | depth
-----------------------------------------
01-01-1999 | 01-01-2000 | dddddd | 2
01-01-2000 | 01-01-2001 | cccccc | 1
01-01-2001 | 01-01-2002 | aaaaaa | 0
01-01-2002 | 01-01-2003 | cccccc | 1
01-01-2003 | 01-01-2004 | bbbbbb | 0
01-01-2004 | 01-01-2005 | cccccc | 1
01-01-2005 | 01-01-2006 | dddddd | 2
Глубина является число родителей, чтобы добраться до значения, но может быть более 2, так что было бы лучше использовать рекурсию.
Можно предположить, что для периодов, имеющих один и тот же родительский элемент, нет совпадений. Все это без использования хранимых процедур, но не стесняйтесь приносить CTE, оконные функции и т. Д.
Одна из главных проблем, с вашим Требование - это ваше определение «глубина». Чтобы рассчитать «глубину» одной определенной строки, вам придется перемещать всех детей, чтобы увидеть, сколько уровней существует. Очень дорого. Было бы намного лучше, если бы у вас было наоборот. То есть, 'dddddd' является глубиной' 0', 'cccccc' является глубиной' 1', а 'aaaaaa' и' bbbbbb' являются глубиной '2'. – sstan
@sstan, определение глубины может быть наоборот, если хотите. Другими словами, не стесняйтесь начинать с родителей, а не с детей. – ortwin45