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;
| moment | inside |
|---|---|
| 09:00:00 | 1 |
| 09:15:00 | 2 |
| 09:30:00 | 3 |
| 09:45:00 | 2 |
| 10:30:00 | 2 |
| 11:00:00 | 1 |
| 12:00:00 | 0 |
Üben:The busiest day