Heim >Datenbank >MySQL-Tutorial >Wie finde ich minimale und maximale Zeitintervalle für aufeinanderfolgende Ereignisse mit Lücken und Inseln?

Wie finde ich minimale und maximale Zeitintervalle für aufeinanderfolgende Ereignisse mit Lücken und Inseln?

Linda Hamilton
Linda HamiltonOriginal
2024-12-17 21:02:14786Durchsuche

How to Find Minimum and Maximum Time Intervals for Consecutive Events with Gaps and Islands?

Minimum und Maximum für aufeinanderfolgende Zeilen mit Lücken und Inseln ermitteln

Im Kontext eines geordneten Datensatzes, der Sequenzen von Ereignissen enthält, die durch Zeilen in dargestellt werden In einer Tabelle besteht die Aufgabe darin, die minimalen und maximalen Zeitintervalle für aufeinanderfolgende Zeilen zu bestimmen, die denselben Ereignistyp aufweisen. Dieses Problem entsteht beim Umgang mit Daten mit Lücken und Inseln, wodurch herkömmliche Aggregationsmethoden unzureichend sind.

Verstehen der Eingabe

Die Eingabetabelle besteht aus den folgenden Spalten:

  • Name: Eindeutige Kennung für jeden Person
  • Aktion: Ereignistyp, entweder „Schlaf“ oder „Wach“
  • rn: Zeilennummer innerhalb der Ereignissequenz jeder Person
  • startt: Startzeit des Ereignis
  • endd: Endzeit des Ereignisses

Identifizieren aufeinanderfolgender Gruppen

Um aufeinanderfolgende Gruppen von Zeilen zu identifizieren Bei gleichem Ereignistyp berechnen wir die Differenz zwischen den Zeilennummern für den Ereignistyp und der Gesamtzeile Nummerierung:

row_number() over (partition by name, act order by rn) as seqnum_na
row_number() over (partition by name order by rn) as seqnum_n

Diese neuen Spalten, seqnum_na und seqnum_n, repräsentieren die Sequenznummer für den Ereignistyp bzw. die Gesamtsequenznummer. Durch Subtrahieren von seqnum_na von seqnum_n wird eine neue Spalte erstellt, die die Gruppennummer für jede aufeinanderfolgende Teilmenge von Zeilen innerhalb eines Ereignistyps darstellt.

Aggregation mit Gruppennummer

Mit der Gruppennummer identifiziert, können wir die Start- und Endzeiten aggregieren, um das Minimum und Maximum für jede Gruppe zu ermitteln:

select name, act, min(startt) as startt, max(endd) as endd
from (select i.*,
             row_number() over (partition by name, act order by rn) as seqnum_na,
             row_number() over (partition by name order by rn) as seqnum_n
      from input i
     ) i
group by (seqnum_n - seqnum_na), name, act;

Nach Durch die Gruppierung nach dieser Gruppennummer zusammen mit dem Namen und dem Ereignistyp identifizieren und aggregieren wir effizient die aufeinanderfolgenden Zeilen innerhalb jeder Teilmenge und liefern so die gewünschten minimalen und maximalen Zeitintervalle.

Das obige ist der detaillierte Inhalt vonWie finde ich minimale und maximale Zeitintervalle für aufeinanderfolgende Ereignisse mit Lücken und Inseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn