in Oracle 10g Angenommen, ich habe eine Tabelle wie folgt aus:Split Zeile in mehrere Zeilen basierend auf der Zeit
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
Ich möchte Lücken sehen, in die vom übergeordneten überlappungsfrei gefüllt werden. Genauer gesagt soll das Ergebnis so etwas wie:
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
Die Tiefe die Zahl der Eltern ist auf den Wert zu erhalten, aber kann dann 2, mehr sein, so wäre es am besten Rekursion zu verwenden.
Sie können davon ausgehen, dass es keine Überlappung für die Zeiträume gibt, die dasselbe übergeordnete Element haben. All dies ohne Verwendung gespeicherter Prozeduren, aber Sie können CTEs, Fensterfunktionen usw. mitbringen.
Eines der wichtigsten Probleme mit Ihrem Voraussetzung ist Ihre Definition von "Tiefe". Um die Tiefe einer bestimmten Zeile zu berechnen, müssen Sie alle untergeordneten Elemente navigieren, um zu sehen, wie viele Ebenen vorhanden sind. Sehr teuer. Es wäre viel besser, wenn Sie es umgekehrt hätten. Das heißt, dass "dddddd" die Tiefe "0" ist, "cccccc" die Tiefe "1" ist und "aaaaaa" und "bbbbbb" die Tiefe "2" sind. – sstan
@sstan, die Definition der Tiefe kann umgekehrt sein, wenn Sie möchten. Mit anderen Worten, fühlen Sie sich frei, von den Eltern anstatt von den Kindern zu beginnen. – ortwin45