2016-04-04 17 views
0

Ich habe Zeiträume in verschiedenen Einheiten pro Benutzer in einer Tabelle verbracht. Die Zeiträume überschneiden sich und ich möchte das beheben. Ich habe:PostgreSQL, überlappende Zeiträume finden und fixieren

user|unit|start_time|end_time 
    1| 1|2015-01-01|2015-01-31 
    1| 2|2015-01-07|2015-01-14 
    2| 1|2015-01-09|2015-01-13 
    2| 2|2015-01-10|2015-01-15 

dh. Benutzer 1 wurde am 01.01.2015 von Gerät 1 gestartet, am 07.01.2015 in Gerät 2 übertragen, am 14.01.2015 in Gerät 1 und am 31.01.2015 von Gerät 1 zurückgeliefert. Der Benutzer kann nicht an zwei Orten zugleich sein, so die Tabelle wie folgt aussehen sollte:

user|unit|start_time|end_time 
    1| 1|2015-01-01|2015-01-07 --fixed end_time 
    1| 2|2015-01-07|2015-01-14 
    1| 1|2015-01-14|2015-01-31 --newly created line 
    2| 1|2015-01-09|2015-01-10 --fixed end_time 
    2| 2|2015-01-10|2015-01-15 

Hier einige SQL ist die Test-Tabelle mit einigen Einträgen zu erstellen.

CREATE TABLE users_n_units 
(
users character varying (100), 
units character varying (100), 
start_time date, 
end_time date 
); 

INSERT INTO users_n_units (users,units,start_time,end_time) 
VALUES ('1','1','2015-01-01','2015-01-31'), 
     ('1','2','2015-01-07','2015-01-14'), 
     ('2','1','2015-01-09','2015-01-13'), 
     ('2','2','2015-01-10','2015-01-15'); 
+0

Was ist, wenn 3 Einheiten sich überlappen? –

+0

Nun, meine Daten haben nur zwei Einheiten, also kann sich 3 nicht überlappen, aber im Allgemeinen beendet das später startende Ereignis das früher beginnende Ereignis und wenn das frühergehende auch nach dem späteren Start noch weitergeht, beginnt es wieder und setzt sich fort bis zu seiner ursprünglichen Endzeit. Wenn es mehr als 2 überlappende Ereignisse gibt, beendet das letztere immer das vorhergehende und die Reihenfolge der Startzeiten sollte eingehalten werden. –

Antwort

0

Sie geben dies nicht wirklich genügend Informationen, um vollständig zu beantworten, und wie andere darauf hingewiesen haben, können Sie mit speziellen Fällen am Ende so sollten Sie vor dem Ausführen von Updates analysieren, was wie Ihre Daten sorgfältig überprüft.

Aber in Ihrer Testumgebung können Sie so etwas versuchen. Der Trick besteht darin, Ihre Tabelle mit Klauseln zu verbinden, die Sie auf die Daten beschränken, die Ihrer Geschäftslogik entsprechen, und sie dann zu aktualisieren.

Diese Anweisung funktioniert mit Ihrem winzigen Beispielsatz und läuft nur durch und legt die Endzeiten mechanisch auf die Startzeiten der folgenden Zeit fest. Ich habe bei ähnlichen Problemen etwas Ähnliches verwendet, daher weiß ich, dass der Mechanismus für Sie funktionieren sollte.

ACHTUNG: Nicht auf etwas anderem als diesem kleinen Satz getestet. Führen Sie keine Produktionsdaten aus!

UPDATE a SET a.end_time = b.start_time 
FROM users_n_units a 
INNER JOIN users_n_units b ON a.users = b.users AND a.units < b.units 
+0

Dies lief nicht in meinem PostgreSQL wie es ist und nach der Korrektur hatte die Ergebnistabelle nur vier Zeilen. –

Verwandte Themen