Anzahl gleichzeitiger Telefonate aus Tabelle mit Start und Ende erstellen

Andreass

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich habe aus einer Telefonanlage folgende Tabelle (vereinfacht dargestellt):

CallID Startdatum Startzeit Enddatum Endzeit
---------------------------------------------------------------------
1 2018-05-02 08:01:15 2018-05-02 08:05:11
2 2018-05-02 08:03:18 2018-05-02 08:04:01
3 2018-05-02 08:04:35 2018-05-02 08:07:46

Ich weiß also, von wann bis wann immer telefoniert wurde. Meine Aufgabe ist nun, herauszufinden, wie viele Gespräche maximal gleichzeitig pro Tag stattgefunden haben.

Leider fehlt mir gerade jegliche Idee wie ich das angehen kann.

Kann mir jemand bitte einen Gedankenanstupser geben...;)

Vielen Dank
Andreass
 
Werbung:
nicht ganz trivial, schon weil Du Datum und Zeit getrennt hast. Das solltest Du im ersten Stepp zu einem Timestamp formen und würde dann so aussehen:

Code:
test=*# select * from telefon;
id |  start  |  ende 
----+---------------------+---------------------
  1 | 2018-05-02 08:01:15 | 2018-05-02 08:05:11
  2 | 2018-05-02 08:03:18 | 2018-05-02 08:04:01
  3 | 2018-05-02 08:04:35 | 2018-05-02 08:07:46
(3 Zeilen)

Nun ein CROSS JOIN, aus dem Du filterst:

  • * ungleiche ID (t1.id != t2.id)
  • überlappende Zeiträume
  • t1.id < t2.id


den ersten und dritten Punkt kann man zusammenfassen, also eigentlich den ersten weglassen. Da kommt raus:

Code:
test=*# select t1.id, tsrange(t1.start, t1.ende) t1range, t2.* from telefon t1 cross join (select id, tsrange(start,ende) t2range from telefon) t2 where tsrange(t1.start,t1.ende) && t2range and t1.id < t2.id;
id |  t1range  | id |  t2range 
----+-----------------------------------------------+----+-----------------------------------------------
  1 | ["2018-05-02 08:01:15","2018-05-02 08:05:11") |  2 | ["2018-05-02 08:03:18","2018-05-02 08:04:01")
  1 | ["2018-05-02 08:01:15","2018-05-02 08:05:11") |  3 | ["2018-05-02 08:04:35","2018-05-02 08:07:46")
(2 Zeilen)

test=*#

Der trickreiche Part ist hier die Prüfung auf Überlappung: tsrange(t1.start,t1.ende) && t2range, der '&&' ist der Überlappungsoperator, den ich auf TSRANGE anwende. Das ist ein Datentyp, den es so wohl nur in PostgreSQL gibt. Du könntest das mit hinreichend viel Mühe auch mit einer ganzen Kette von Vergleichen hinbekommen, das ist nur eine Fleißaufgabe.
 
Ich würde ähnlich vorgehen:
Code:
WITH t(callid,start,ende) AS (
   SELECT   CallID,
       cast(Startdatum AS DATETIME) + Startzeit,
       cast(Enddatum AS DATETIME) + Endzeit
   FROM   tabelle
   ), t3(callid,datum,anzahl) AS (
   SELECT   t1.callid,
       convert(DATE,t1.start) AS datum,
       count(*) + 1 AS anzahl_gleichzeitige_telefonate
   FROM   t t1
   INNER JOIN t t2
   ON     t2.start BETWEEN t1.start AND t1.ende
   OR     t2.ende BETWEEN t1.start AND t1.ende
   GROUP BY t1.callid
   )
SELECT   t3.datum,
     max(t3.anzahl) AS anzahl
FROM   t3
GROUP BY t3.datum
ORDER BY t3.datum DESC
1. Zusammenfassen von start und ende als t
2. zu jedem Telefonat weitere Telefonate joinen
3. Telefonate zählen, t3 ist dann das Ergebnis
4. aus t3 Maximum für jeden Tag bestimmen
 
Danke schon mal für eure Antworten. Ich muss mir das morgen mal in Ruhe anschauen.

Da ich kein PostgreSQL zur Verfügung habe und auch kurzfristig nicht bekomme, scheidet Lösung 1 wohl aus. Das zweite Skript werde ich dann morgen mal mit einer Teilmenge der Daten testen.
 
Werbung:
Zurück
Oben