SQL Zeitraum zerlegen

gamma_matrices

Cadet 4th Year
Registriert
Sep. 2018
Beiträge
121
Hallo,
ich habe zwei Tabellen A und B und beide können über gemeinsamen Schlüssel Id verknüpft werden und in beiden Tabellen kommen jeweils zwei Datumsfelder vor.
A:
Id_ABeginn_AEnde_A
1DatumA1DatumA2
2DatumA3DatumA4
3DatumA5DatumA6

B:
Id_BBeginn_BEnde_B
1DatumB1DatumB2
2DatumB3DatumB4
3DatumB5DatumB6

Problem: Das zeitliche Intervall von B kann auch teils zeitliche Intervalle von A enthalten, wobei das Anfangsdatum in beiden übereinstimmt.
Also zB:
[DatumB1, DatumB2] =[ [DatumA1, DatumA2], [DatumA3, DatumB2]]

Wie kann ich aus dem Intervall von B die Daten auch aus A mir anzeigen lassen?
Gibt es eine Möglichkeit ein Intervall mit Zuordnung zu A zerlegen zu können?

Danke im voraus!
 
Zuletzt bearbeitet:
gamma_matrices schrieb:
gemeinsamen Schlüssel Id
Ist das eine 1:1 Verknüpfung? Dann ist es nicht komplett normalisiert. Ich bin mir nicht sicher, was für eine SQL-Frage du beantworten möchtest. Mit den Platzhaltern wird es nicht besser. Warum ist rechts vom "=" drei mal A und nur einmal B?

Im Zweifel ein FULL OUTER JOIN (oder Kommas bei den Tabellen) und dann filtern. Welches Intervall du willst, kannst du ausrechnen, es gibt nur 16 Kombinationen, wie 4 Zahlen geordnet werden können und schon mal die Hälfte fällt raus, weil Beginn<Ende ist. SQL kennt auch BETWEEN als einfachen Operator für die Sortierfolge von mehreren Werten.
Die Fälle:
B1<B2<A1<A2
B1<A1<B2<A2
B1<A1<A2<B2
A1<B1<B2<A2 <- ich nehm mal den
A1<B1<A2<B2
A1<A2<B1<B2 <- und den

Markier dir, welche du willst und dann
Code:
select * from A,B where A1<B1<B2<A2 or A1<A2<B1<B2

Pass auf falls du auch auf exakt gleiche Werte reagieren willst (offenes vs. geschlossenes Intervall).
 
Hancock schrieb:
Ist das eine 1:1 Verknüpfung? Dann ist es nicht komplett normalisiert. Ich bin mir nicht sicher, was für eine SQL-Frage du beantworten möchtest. Mit den Platzhaltern wird es nicht besser. Warum ist rechts vom "=" drei mal A und nur einmal B?
Die Tabellen sind zwar nicht direkt über Beziehungen miteinander verknüpft, aber sie enthalten beide die selben Ids, weil dieser sich auf dasselbe bezieht.
Außerdem kommt da deshalb 3x A und einmal B vor, um nur als Beispiel zu verdeutlichen, dass das Anfangsdatum übereinstimmt und außerdem noch weitere Daten von A auch in B enthalten sein können bis das Beidpielintervall wieder geschlossen ist. Also in dem ersten Intervall von B kann zum einen das erste Intervall von A ggf. auch noch der Anfang des 2. Intervalls von A enthalten sein, eher das Intervall von B mit DatumB2 wieder geschlossen werden kann.
Ergänzung ()

Hancock schrieb:
Im Zweifel ein FULL OUTER JOIN (oder Kommas bei den Tabellen) und dann filtern. Welches Intervall du willst, kannst du ausrechnen, es gibt nur 16 Kombinationen, wie 4 Zahlen geordnet werden können und schon mal die Hälfte fällt raus, weil Beginn<Ende ist. SQL kennt auch BETWEEN als einfachen Operator für die Sortierfolge von mehreren Werten.
Die Fälle:
B1<B2<A1<A2
B1<A1<B2<A2
B1<A1<A2<B2
A1<B1<B2<A2 <- ich nehm mal den
A1<B1<A2<B2
A1<A2<B1<B2 <- und den

Markier dir, welche du willst und dann
Code:
select * from A,B where A1<B1<B2<A2 or A1<A2<B1<B2

Pass auf falls du auch auf exakt gleiche Werte reagieren willst (offenes vs. geschlossenes Intervall).
Wie würde dabei der allgemeine Fall aussehen?
Ergänzung ()

Würde hier im WHERE Teil eine IF Anweisung passen?
Ergänzung ()

Ich würde gerne ALLGEMEIN wissen wollen, wie man generell in solchen Fällen vorgehen könnte, dass ein Intervall sich mit Zuordnung zerlegen lassen lässt?
 
Zuletzt bearbeitet:
gamma_matrices schrieb:
Die Tabellen sind zwar nicht direkt über Beziehungen miteinander verknüpft, aber sie enthalten beide die selben Ids, weil dieser sich auf dasselbe bezieht.
Ok, also eher n:m, aber wenigstens kannst du für Performance dann die Daten schonmal vorher filtern...

gamma_matrices schrieb:
das Anfangsdatum übereinstimmt und außerdem noch weitere Daten von A auch in B enthalten sein können bis das Beidpielintervall wieder geschlossen ist
Das Beispielintervall ist eine Zeile aus B? Das heist du willst eine Liste von Intervallen aus A die in B eingeschlossen sind. Dann kannst du alle Intervalle aus A finden, die für das Intervall B passen via
Code:
select B.B as BeginObservation,B.E as EndObservation,MAX(B.A,A.B) as BeginSubset,MIN(B.E,A.E) as EndSubset from B left outer join A on 
1 and -- here the relationship with the IDs
(
A.E between B.B and B.E -- A ends within
or
A.B between B.B and B.E -- A starts within B
or
A.B< B.B and A.E>B.E -- A encloses B
)
Das MIN und MAX macht, dass das Intervall aus Spalte 3 und 4 jeweils bei den Limits von B endet.
gamma_matrices schrieb:
Wie würde dabei der allgemeine Fall aussehen?
Na ja, du hast 4 Zahlen, die kann man vergleichen, wenn ich < sind das pro Zahlenpaar 1 "bit", also brauchst du für zwei Intervall 4 "Bit" und hast daher 16 Möglichkeiten. Das ist aber für den allgemeinsten Fall, es vereinfacht sich immer mit den Nebenbedingungen.
gamma_matrices schrieb:
Ich würde gerne ALLGEMEIN wissen wollen, wie man generell in solchen Fällen vorgehen könnte, dass ein Intervall sich mit Zuordnung zerlegen lassen lässt?
Wie in einer Datenbank sind Intervalle mathematische Mengen. Du musst dir überlegen, welche Operation du willst (ich meine eine UNION erkannt zu haben) und dann dir überlegen, wie du das berechnen kannst. Bei einer abzählbarer Menge (wie es Einträge in einer DB sind) ist das elegant formulierbar. Bei Intervallen mit unabzählbar vielen Elementen wird es dann etwas schwieriger, da braucht es dann etwas "Knobelei".
 
  • Gefällt mir
Reaktionen: gamma_matrices
Hancock schrieb:
Code:
select B.B as BeginObservation,B.E as EndObservation,MAX(B.A,A.B) as BeginSubset,MIN(B.E,A.E) as EndSubset from B left outer join A on
1 and -- here the relationship with the IDs
(
A.E between B.B and B.E -- A ends within
or
A.B between B.B and B.E -- A starts within B
or
A.B< B.B and A.E>B.E -- A encloses B
)
Folgende Fragen zu den Notationen:

1. A.B und B.B --> Welches Attribut ist das B (an 2. Stelle)?
2. Analog B.E und A.E --> E?
3. B.A --> ?
 
Hancock schrieb:
Code:
... on
1 and -- here the relationship with the IDs
(
...
)
Was ist eigentlich mit "1" in der Query gemeint?🤔 Hätte jetzt eher gedacht, dass dort A.Id_A = B.Id_B hinkommen sollte!
 
Zurück
Oben