Freigeben über


scan-Operator

Scannt Daten, führt Abgleiche durch und erstellt Sequenzen basierend auf den Prädikaten.

Übereinstimmende Datensätze werden anhand von Prädikaten bestimmt, die in den Schritten des Operators definiert sind. Ein Prädikat kann vom Zustand abhängen, der von den vorherigen Schritten generiert wird. Die Ausgabe für den übereinstimmenden Datensatz wird durch den Eingabedatensatz und die Zuweisungen bestimmt, die in den Schritten des Operators definiert sind.

Syntax

T| scan [ with_match_id=MatchIdColumnName ] [ declare(ColumnDeclarations) ] with(StepDefinitions)

ColumnDeclarations-Syntax

Columnname:ColumnType[=DefaultValue ] [, ... ]

StepDefinition-Syntax

stepStepName [ output | last = all | none] :Bedingung [ =>Spaltenzuweisung= [, ... ] ];

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich Beschreibung
T string ✔️ Die tabellarische Eingabequelle.
MatchIdColumnName string Der Name einer Spalte vom Typ long , die im Rahmen der Scanausführung an die Ausgabe angefügt wird. Gibt den 0-basierten Index der Übereinstimmung für den Datensatz an.
ColumnDeclarations string Deklariert eine Erweiterung für das Schema von T. Diesen Spalten werden in den Schritten Werte zugewiesen. Wenn sie nicht zugewiesen ist, wird der DefaultValue zurückgegeben. Sofern nicht anders angegeben, ist nullDefaultValue .
StepName string ✔️ Wird verwendet, um auf Werte im Zustand der Überprüfung auf Bedingungen und Zuweisungen zu verweisen. Der Schrittname muss eindeutig sein.
Condition string ✔️ Ein Ausdruck, der mit true oder ausgewertet wird, false der definiert, welche Datensätze aus der Eingabe mit dem Schritt übereinstimmen. Ein Datensatz stimmt mit dem Schritt überein, wenn die Bedingung true mit dem Status des Schritts oder mit dem Status des vorherigen Schritts übereinstimmt.
Abtretung string Ein Skalarausdruck, der der entsprechenden Spalte zugewiesen wird, wenn ein Datensatz mit einem Schritt übereinstimmt.
output string Steuert die Ausgabelogik des Schritts bei wiederholten Übereinstimmungen. all gibt alle Datensätze aus, die dem Schritt entsprechen, last gibt nur den letzten Datensatz in einer Reihe wiederholter Übereinstimmungen für den Schritt aus, und none es werden keine Datensätze ausgegeben, die dem Schritt entsprechen. Der Standardwert ist all.

Gibt zurück

Ein Datensatz für jede Übereinstimmung eines Datensatzes von der Eingabe bis zu einem Schritt. Das Schema der Ausgabe ist das Schema der Quelle, das mit der Spalte in der declare -Klausel erweitert wird.

Scanlogik

scan übergibt die serialisierten Eingabedaten Datensatz für Datensatz, vergleicht jeden Datensatz mit der Bedingung jedes Schritts, wobei der aktuelle Zustand der einzelnen Schritte berücksichtigt wird.

State

Der zugrunde liegende Zustand des scan Operators kann als Eine Tabelle mit einer Zeile für jeden stepbetrachtet werden. Jeder Schritt behält seinen eigenen Zustand mit den neuesten Werten der Spalten und deklarierten Variablen aus allen vorherigen Schritten und dem aktuellen Schritt bei. Falls relevant, enthält es auch die Übereinstimmungs-ID für die laufende Sequenz.

Wenn ein Scanoperator n Schritte mit dem Namen s_1, s_2, ..., s_n enthält Schritt s_kk-Datensätze in seinem Zustand, der s_1, s_2, ... , s_k entspricht. Der Schrittname. Das ColumnName-Format wird verwendet, um auf einen Wert im Zustand zu verweisen. Für instance würde auf die Spalte col1 verweisen, s_2.col1 die zu Schritt s_2 im Zustand von s_k gehört. Ein ausführliches Beispiel finden Sie in der exemplarischen Vorgehensweise zur Überprüfungslogik.

Der Zustand beginnt leer und wird aktualisiert, wenn ein gescannter Eingabedatensatz mit einem Schritt übereinstimmt. Wenn der Status des aktuellen Schritts nicht leer ist, wird der Schritt als aktive Sequenz bezeichnet.

Abgleichslogik

Jeder Eingabedatensatz wird mit allen Schritten in umgekehrter Reihenfolge vom letzten Schritt bis zum ersten ausgewertet. Wenn ein Datensatz r für einen Schritt s_k ausgewertet wird, wird die folgende Logik angewendet:

  • Überprüfung 1: Wenn der Zustand des vorherigen Schritts (s_k-1) nicht leer ist und r die Bedingung von s_k erfüllt, tritt eine Übereinstimmung auf. Die Übereinstimmung führt zu den folgenden Aktionen:

    1. Der Status der s_k wird gelöscht.
    2. Der Zustand von s_k-1 wird zum Zustand der s_k heraufgestuft.
    3. Die Zuordnungen von s_k werden berechnet und erweitern r.
    4. Das erweiterte r wird der Ausgabe und dem Zustand von s_k hinzugefügt.

    Hinweis

    Wenn Check 1 zu einer Übereinstimmung führt, wird Check 2 ignoriert, und r wird mit s_k-1 ausgewertet.

  • Überprüfen Sie 2: Wenn der Status von s_k eine aktive Sequenz aufweist oder s_k der erste Schritt ist und r die Bedingung von s_k erfüllt, tritt eine Übereinstimmung auf. Die Übereinstimmung führt zu den folgenden Aktionen:

    1. Die Zuordnungen von s_k werden berechnet und erweitern r.
    2. Die Werte, die s_k im Zustand von s_k darstellen, werden durch die Werte des erweiterten r ersetzt.
    3. Wenn s_k als output=alldefiniert ist, wird das erweiterte r der Ausgabe hinzugefügt.
    4. Wenn s_k der erste Schritt ist, beginnt eine neue Sequenz, und die Übereinstimmungs-ID erhöht sich um 1. Dies wirkt sich nur auf die Ausgabe aus, wenn with_match_id verwendet wird.

Sobald die Überprüfungen auf s_k abgeschlossen sind, wird r mit s_k-1 ausgewertet.

Ein ausführliches Beispiel für diese Logik finden Sie in der exemplarischen Vorgehensweise zur Überprüfungslogik.

Beispiele

Kumulative Summe

Berechnen Sie die kumulative Summe für eine Eingabespalte. Das Ergebnis dieses Beispiels entspricht der Verwendung von row_cumsum().

range x from 1 to 5 step 1 
| scan declare (cumulative_x:long=0) with 
(
    step s1: true => cumulative_x = x + s1.cumulative_x;
)

Ausgabe

x cumulative_x
1 1
2 3
3 6
4 10
5 15

Kumulative Summe für mehrere Spalten mit einer Zurücksetzungsbedingung

Berechnen Sie die kumulative Summe für zwei Eingabespalten, und setzen Sie den Summenwert auf den aktuellen Datensatzwert zurück, wenn die kumulative Summe 10 oder mehr erreicht hat.

range x from 1 to 5 step 1
| extend y = 2 * x
| scan declare (cumulative_x:long=0, cumulative_y:long=0) with 
(
    step s1: true => cumulative_x = iff(s1.cumulative_x >= 10, x, x + s1.cumulative_x), 
                     cumulative_y = iff(s1.cumulative_y >= 10, y, y + s1.cumulative_y);
)

Ausgabe

x Y cumulative_x cumulative_y
1 2 1 2
2 4 3 6
3 6 6 12
4 8 10 8
5 10 5 18

Weiter ausfüllen einer Spalte

Füllen Sie eine Zeichenfolgenspalte vorwärts aus. Jedem leeren Wert wird der zuletzt angezeigte nicht leere Wert zugewiesen.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "",
    2m, "B",
    3m, "",
    4m, "",
    6m, "C",
    8m, "",
    11m, "D",
    12m, ""
]
;
Events
| sort by Ts asc
| scan declare (Event_filled: string="") with 
(
    step s1: true => Event_filled = iff(isempty(Event), s1.Event_filled, Event);
)

Ausgabe

Ts Ereignis Event_filled
00:00:00 Ein Ein
00:01:00 Ein
00:02:00 B B
00:03:00 B
00:04:00 B
00:06:00 C C
00:08:00 C
00:11:00 D D
00:12:00 D

Tagging für Sitzungen

Teilen Sie die Eingabe in Sitzungen auf: Eine Sitzung endet 30 Minuten nach dem ersten Ereignis der Sitzung, danach beginnt eine neue Sitzung. Beachten Sie die Verwendung des with_match_id Flags, das für jede eindeutige Übereinstimmung (Sitzung) der Überprüfung einen eindeutigen Wert zuweist. Beachten Sie auch die spezielle Verwendung von zwei Schritten in diesem Beispiel, hat true als Bedingung, inSession dass alle Datensätze aus der Eingabe erfasst und ausgegeben werden, während endSession Datensätze erfasst werden, die mehr als 30 Meter vom Wert für die sessionStart aktuelle Übereinstimmung entfernt sind. Der endSession Schritt hat output=none die Bedeutung, dass er keine Ausgabedatensätze erzeugt. Der endSession Schritt wird verwendet, um den Status der aktuellen Übereinstimmung von inSession auf zu vorzurücken endSession, sodass eine neue Übereinstimmung (Sitzung) beginnend mit dem aktuellen Datensatz beginnen kann.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "A",
    2m, "B",
    3m, "D",
    32m, "B",
    36m, "C",
    38m, "D",
    41m, "E",
    75m, "A"
]
;
Events
| sort by Ts asc
| scan with_match_id=session_id declare (sessionStart: timespan) with 
(
    step inSession: true => sessionStart = iff(isnull(inSession.sessionStart), Ts, inSession.sessionStart);
    step endSession output=none: Ts - inSession.sessionStart > 30m;
)

Ausgabe

Ts Ereignis sessionStart session_id
00:00:00 Ein 00:00:00 0
00:01:00 Ein 00:00:00 0
00:02:00 B 00:00:00 0
00:03:00 D 00:00:00 0
00:32:00 B 00:32:00 1
00:36:00 C 00:32:00 1
00:38:00 D 00:32:00 1
00:41:00 E 00:32:00 1
01:15:00 Ein 01:15:00 2

Ereignisse zwischen "Start" und "Stop"

Suchen Sie alle Sequenzen von Ereignissen zwischen dem Ereignis Start und dem Ereignis Stop , die innerhalb von 5 Minuten auftreten. Weisen Sie jeder Sequenz eine Übereinstimmungs-ID zu.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "Start",
    2m, "B",
    3m, "D",
    4m, "Stop",
    6m, "C",
    8m, "Start",
    11m, "E",
    12m, "Stop"
]
;
Events
| sort by Ts asc
| scan with_match_id=m_id with 
(
    step s1: Event == "Start";
    step s2: Event != "Start" and Event != "Stop" and Ts - s1.Ts <= 5m;
    step s3: Event == "Stop" and Ts - s1.Ts <= 5m;
)

Ausgabe

Ts Ereignis m_id
00:01:00 Start 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Beenden 0
00:08:00 Start 1
00:11:00 E 1
00:12:00 Beenden 1

Berechnen eines benutzerdefinierten Trichters mit Ereignissen

Berechnen Sie eine Trichtervervollständigung der Sequenz Hail -Thunderstorm Wind>Tornado> mit State benutzerdefinierten Schwellenwerten für die Zeiten zwischen den Ereignissen (Tornado innerhalb 1h und Thunderstorm Wind innerhalb ).2h Dieses Beispiel ähnelt dem funnel_sequence_completion-Plug-In, ermöglicht jedoch mehr Flexibilität.

StormEvents
| partition hint.strategy=native by State 
    (
    sort by StartTime asc
    | scan with 
    (
        step hail: EventType == "Hail";
        step tornado: EventType == "Tornado" and StartTime - hail.StartTime <= 1h;
        step thunderstormWind: EventType == "Thunderstorm Wind" and StartTime - tornado.StartTime <= 2h;
    )
    )
| summarize dcount(State) by EventType

Ausgabe

EventType dcount_State
Hagel 50
Tornado 34
Sturm 32

Exemplarische Vorgehensweise zum Scannen der Logik

In diesem Abschnitt wird die Scanlogik anhand einer schrittweisen exemplarischen Vorgehensweise des Beispiels Ereignisse zwischen Start und Beenden veranschaulicht:

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "Start",
    2m, "B",
    3m, "D",
    4m, "Stop",
    6m, "C",
    8m, "Start",
    11m, "E",
    12m, "Stop"
]
;
Events
| sort by Ts asc
| scan with_match_id=m_id with 
(
    step s1: Event == "Start";
    step s2: Event != "Start" and Event != "Stop" and Ts - s1.Ts <= 5m;
    step s3: Event == "Stop" and Ts - s1.Ts <= 5m;
)

Der Zustand

Stellen Sie sich den Zustand des scan Operators als Eine Tabelle mit einer Zeile für jeden Schritt vor, in dem jeder Schritt seinen eigenen Zustand hat. Dieser Zustand enthält die neuesten Werte der Spalten und deklarierten Variablen aus allen vorherigen Schritten und dem aktuellen Schritt. Weitere Informationen finden Sie unter Status.

In diesem Beispiel kann der Zustand mit der folgenden Tabelle dargestellt werden:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 X X
s3

Das "X" gibt an, dass ein bestimmtes Feld für diesen Schritt irrelevant ist.

Die übereinstimmende Logik

Dieser Abschnitt folgt der übereinstimmenden Logik durch jeden Datensatz der Events Tabelle und erläutert die Transformation des Zustands und der Ausgabe bei jedem Schritt.

Hinweis

Ein Eingabedatensatz wird mit den Schritten in umgekehrter Reihenfolge vom letzten Schritt (s3) bis zum ersten Schritt (s1) ausgewertet.

Datensatz 1

Ts Ereignis
0 m „A“

Zeichnen Sie die Auswertung bei jedem Schritt auf:

  • s3: Überprüfung 1 wird nicht bestanden, da der Status von s2 leer ist, und Check 2 nicht bestanden wird, da s3 keine aktive Sequenz vorhanden ist.
  • s2: Überprüfung 1 wird nicht bestanden, da der Status von s1 leer ist, und Check 2 nicht bestanden wird, da s2 keine aktive Sequenz vorhanden ist.
  • s1: Überprüfung 1 ist irrelevant, da es keinen vorherigen Schritt gibt. Check 2 wird nicht bestanden, da der Datensatz die Bedingung von Event == "Start"nicht erfüllt. Datensatz 1 wird verworfen, ohne dass sich dies auf den Zustand oder die Ausgabe auswirkt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 X X
s3

Datensatz 2

Ts Ereignis
1m "Start"

Zeichnen Sie die Auswertung bei jedem Schritt auf:

  • s3: Überprüfung 1 wird nicht bestanden, da der Status von s2 leer ist, und Check 2 nicht bestanden wird, da s3 keine aktive Sequenz vorhanden ist.
  • s2: Überprüfung 1 wird nicht bestanden, da der Status von s1 leer ist, und Check 2 nicht bestanden wird, da s2 keine aktive Sequenz vorhanden ist.
  • s1: Überprüfung 1 ist irrelevant, da es keinen vorherigen Schritt gibt. Überprüfung 2 wird übergeben, da der Datensatz die Bedingung von Event == "Start"erfüllt. Durch diese Übereinstimmung wird eine neue Sequenz initiiert, die m_id zugewiesen ist. Datensatz 2 und sein m_id (0) werden dem Zustand und der Ausgabe hinzugefügt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 0 00:01:00 "Start" X X X X
s2 X X
s3

Datensatz 3

Ts Ereignis
2m „B“

Zeichnen Sie die Auswertung bei jedem Schritt auf:

  • s3: Überprüfung 1 wird nicht bestanden, da der Status von s2 leer ist, und Check 2 nicht bestanden wird, da s3 keine aktive Sequenz vorhanden ist.
  • s2: Überprüfung 1 wird bestanden, da der Zustand von s1 nicht leer ist und der Datensatz die Bedingung von Ts - s1.Ts < 5merfüllt. Durch diese Übereinstimmung wird der Zustand von s1 gelöscht und die Sequenz in s1 zu s2heraufgestuft. Datensatz 3 und dessen m_id (0) werden dem Zustand und der Ausgabe hinzugefügt.
  • s1: Überprüfung 1 ist irrelevant, da es keinen vorherigen Schritt gibt, und Check 2 wird nicht bestanden, da der Datensatz die Bedingung von Event == "Start"nicht erfüllt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 0 00:01:00 "Start" 00:02:00 „B“ X X
s3

Datensatz 4

Ts Ereignis
3m "D"

Zeichnen Sie die Auswertung bei jedem Schritt auf:

  • s3: Überprüfung 1 wird nicht bestanden, weil der Datensatz die Bedingung von Event == "Stop"nicht erfüllt, und Check 2 wird nicht bestanden, da s3 keine aktive Sequenz vorhanden ist.
  • s2: Check 1 wird nicht übergeben, da der Zustand von s1 leer ist. Sie besteht Überprüfung 2 , da sie die Bedingung von Ts - s1.Ts < 5merfüllt. Datensatz 4 und dessen m_id (0) werden dem Zustand und der Ausgabe hinzugefügt. Die Werte aus diesem Datensatz überschreiben die vorherigen Zustandswerte für s2.Ts und s2.Event.
  • s1: Überprüfung 1 ist irrelevant, da es keinen vorherigen Schritt gibt, und Check 2 wird nicht bestanden, da der Datensatz die Bedingung von Event == "Start"nicht erfüllt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 0 00:01:00 "Start" 00:03:00 "D" X X
s3

Datensatz 5

Ts Ereignis
4m "Stop"

Aufzeichnen der Auswertung bei jedem Schritt:

  • s3: Check 1 wird übergeben, weil s2 nicht leer ist und die s3 Bedingung von Event == "Stop"erfüllt. Diese Übereinstimmung bewirkt, dass der Zustand von s2 gelöscht und die Sequenz in s2 zu s3heraufgestuft wird. Datensatz 5 und sein m_id (0) werden dem Zustand und der Ausgabe hinzugefügt.
  • s2: Check 1 wird nicht übergeben, weil der Status von s1 leer ist, und Check 2 wird nicht bestanden, da s2 keine aktive Sequenz vorhanden ist.
  • s1: Überprüfung 1 ist irrelevant, da es keinen vorherigen Schritt gibt. Überprüfung 2 wird nicht bestanden, da der Datensatz nicht die Bedingung von Event == "Start"erfüllt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Datensatz 6

Ts Ereignis
6m „C“

Aufzeichnen der Auswertung bei jedem Schritt:

  • s3: Überprüfung 1 wird nicht übergeben, weil der Status von s2 leer ist, und Check 2 wird nicht bestanden, da s3 die s3 Bedingung von Event == "Stop"nicht erfüllt ist.
  • s2: Check 1 wird nicht übergeben, weil der Status von s1 leer ist, und Check 2 wird nicht bestanden, da s2 keine aktive Sequenz vorhanden ist.
  • s1: Überprüfung 1 wird nicht bestanden, weil kein vorheriger Schritt vorhanden ist, und Überprüfung 2 wird nicht bestanden, da sie die Bedingung von Event == "Start"nicht erfüllt. Datensatz 6 wird verworfen, ohne sich auf den Zustand oder die Ausgabe zu auswirken.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Datensatz 7

Ts Ereignis
8m "Start"

Aufzeichnen der Auswertung bei jedem Schritt:

  • s3: Check 1 isn't passed, because the state of s2 is empty, and Check 2 isn't passed, because it doesn't meet the condition of Event == "Stop".
  • s2: Check 1 wird nicht übergeben, weil der Status von s1 leer ist, und Check 2 wird nicht bestanden, da s2 keine aktive Sequenz vorhanden ist.
  • s1: Check 1 isn't passed because there's previous step. Sie besteht Check 2 , da sie die Bedingung von Event == "Start"erfüllt. Diese Übereinstimmung initiiert eine neue Sequenz in s1 mit einem neuen m_id. Datensatz 7 und sein m_id (1) werden dem Zustand und der Ausgabe hinzugefügt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 1 00:08:00 "Start" X X X X
s2 X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Hinweis

Es gibt jetzt zwei aktive Sequenzen im Zustand.

Datensatz 8

Ts Ereignis
11m "E"

Aufzeichnen der Auswertung bei jedem Schritt:

  • s3: Check 1 isn't passed, because the state of s2 is empty, and Check 2 isn't passed, because it doesn't meet the s3 condition of Event == "Stop".
  • s2: Überprüfung 1 wird übergeben, da der Zustand von s1 nicht leer ist und der Datensatz die Bedingung von Ts - s1.Ts < 5merfüllt. Diese Übereinstimmung bewirkt, dass der Zustand von s1 gelöscht und die Sequenz in s1 zu s2heraufgestuft wird. Datensatz 8 und sein m_id (1) werden dem Zustand und der Ausgabe hinzugefügt.
  • s1: Überprüfung 1 ist irrelevant, da es keinen vorherigen Schritt gibt, und Check 2 wird nicht übergeben, da der Datensatz die Bedingung von Event == "Start"nicht erfüllt.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 1 00:08:00 "Start" 00:11:00 "E" X X
s3 0 00:01:00 "Start" 00:03:00 "D" 00:04:00 "Stop"

Datensatz 9

Ts Ereignis
12m "Stop"

Aufzeichnen der Auswertung bei jedem Schritt:

  • s3: Check 1 wird übergeben, weil s2 nicht leer ist und die s3 Bedingung von Event == "Stop"erfüllt. Diese Übereinstimmung bewirkt, dass der Zustand von s2 gelöscht und die Sequenz in s2 zu s3heraufgestuft wird. Datensatz 9 und sein m_id (1) werden dem Zustand und der Ausgabe hinzugefügt.
  • s2: Check 1 wird nicht übergeben, weil der Status von s1 leer ist, und Check 2 wird nicht bestanden, da s2 keine aktive Sequenz vorhanden ist.
  • s1: Check 1 isn't passed because there's previous step. Sie besteht Check 2 , da sie die Bedingung von Event == "Start"erfüllt. Diese Übereinstimmung initiiert eine neue Sequenz in s1 mit einem neuen m_id.

Staat:

Schritt m_id s1. Ts s1. Ereignis s2. Ts s2. Ereignis s3. Ts s3. Ereignis
s1 X X X X
s2 X X
s3 1 00:08:00 "Start" 00:11:00 "E" 00:12:00 "Stop"

Endgültige Ausgabe

Ts Ereignis m_id
00:01:00 Start 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Beenden 0
00:08:00 Start 1
00:11:00 E 1
00:12:00 Beenden 1