PostgreSQL-Abfrage zur Erkennung überlappender Zeitbereiche

8

Ich habe eine Tabelle in PostgreSQL 9.2, die so aussieht (vereinfacht):

%Vor%

Für jede feature_id können mehrere Zeilen mit Zeitbereichen von begin_time / end_time angegeben werden. Sie können sich überschneiden, aber das ist relativ selten. Ich suche nach einem schnellen Weg, um alle Feature_IDs zu finden, die keine Überlappungen haben / haben.

Ich habe das mit Fensterfunktionen versucht, wie folgt:

%Vor%

... aber das funktioniert nicht:

%Vor%

Der Algorithmus ist einfach: Ordne die Zeilen für eine gegebene feature_id nach begin_time und überprüfe, ob end_time & gt; die nächste begin_time (falls vorhanden). Ich vermute, dass es einen leichten Weg geben muss, vielleicht mit tsrange Funktionen, aber ich kann es gerade jetzt nicht finden.

    
EM0 08.09.2014, 21:27
quelle

2 Antworten

14

Dies kann in der Tat mithilfe von Bereichstypen erfolgen.

Im Folgenden werden alle Zeilen mit überlappenden Bereichen ausgewählt:

%Vor%

Wenn Sie die Bedingung in NOT EXISTS ändern, finden Sie diejenigen, die keine überlappenden Bereiche haben.

SQLFiddle Beispiel: Ссылка

tsrange(f2.begin_time, f2.end_time, '[]') erstellt einen Bereich, der die oberen und unteren Grenzen enthält. Sie können auch Bereiche erstellen, die entweder einen oder beide ausschließen.

Weitere Details finden Sie im Handbuch:
Ссылка

Der Operator && prüft, ob sich die beiden Bereiche überschneiden: Ссылка

(Ich wünschte nur, Oracle hätte so etwas Besonderes ...)

    
a_horse_with_no_name 08.09.2014, 21:44
quelle
2

Hier ist eine Beobachtung. Wenn sich für ein Feature überlappende Zeiträume ergeben, überschneidet sich mindestens ein Zeitraum mit dem vorherigen, wie in begin_time definiert. (Sie können das anders sehen. Wenn es keine solchen Überlappungen gibt, dann gibt es immer eine Lücke zwischen einem Zeitrahmen und dem nächsten und nichts überlappt sich.)

Dies führt zu folgender Abfrage zur Ermittlung von Überlappungen:

%Vor%     
Gordon Linoff 08.09.2014 21:52
quelle

Tags und Links