SQL Dojo Beta
Muster

Gleichzeitigkeitsspitze

Wie viele Dinge höchstens gleichzeitig aktiv waren: +1 bei jedem Beginn, −1 bei jedem Ende, dann eine laufende Summe.

Machen Sie aus jedem Zeitraum zwei Ereignisse, (start, +1) und (end, −1), mit UNION ALL. Summieren Sie die Ereignisse zuerst pro Zeitpunkt, dann liefert SUM(net) OVER (ORDER BY instant), wie viele nach jedem Zeitpunkt aktiv sind; ihr Maximum ist die Spitze. Jeder Zeitraum wird zweimal gelesen, statt jeden Tag mit jedem Zeitraum zu joinen. Verwendet für Abonnements, offene Tickets, Räume, Server.

WITH visits(arrived, left_at) AS (VALUES
  (TIME '09:00', TIME '10:30'), (TIME '09:15', TIME '09:45'),
  (TIME '09:30', TIME '11:00'), (TIME '10:30', TIME '12:00')),
changes AS (
  SELECT arrived AS moment, 1 AS delta FROM visits
  UNION ALL
  SELECT left_at, -1 FROM visits
),
per_instant AS (SELECT moment, SUM(delta) AS net FROM changes GROUP BY moment)
SELECT moment, SUM(net) OVER (ORDER BY moment) AS inside
FROM per_instant
ORDER BY moment;
momentinside
09:00:001
09:15:002
09:30:003
09:45:002
10:30:002
11:00:001
12:00:000
In Randori ausprobieren