

Nach reiflicher Überlegung haben wir uns entschieden, Amazon Kinesis Data Analytics für SQL-Anwendungen einzustellen:

1. Ab dem **1. September 2025** werden wir keine Bugfixes für Amazon Kinesis Data Analytics for SQL-Anwendungen bereitstellen, da wir aufgrund der bevorstehenden Einstellung nur eingeschränkten Support dafür haben werden.

2. Ab dem **15. Oktober 2025** können Sie keine neuen Kinesis Data Analytics for SQL-Anwendungen mehr erstellen.

3. Wir werden Ihre Anwendungen ab dem **27. Januar 2026** löschen. Sie können Ihre Amazon Kinesis Data Analytics for SQL-Anwendungen nicht starten oder betreiben. Ab diesem Zeitpunkt ist kein Support mehr für Amazon Kinesis Data Analytics for SQL verfügbar. Weitere Informationen finden Sie unter [Einstellung von Amazon Kinesis Data Analytics für SQL-Anwendungen](discontinuation.md).

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# SQL-Streaming-Konzepte
<a name="streaming-sql-concepts"></a>

Amazon-Kinesis-Data-Analytics implementiert den ANSI 2008 SQL-Standard mit Erweiterungen. Diese Erweiterungen ermöglichen Ihnen die Verarbeitung von Streaming-Daten. Die folgenden Themen behandeln wichtige SQL-Streaming-Konzepte.

**Topics**
+ [In-Application-Streams und Pumps](streams-pumps.md)
+ [Zeitstempel und die ROWTIME-Spalte](timestamps-rowtime-concepts.md)
+ [Kontinuierliche Abfragen](continuous-queries-concepts.md)
+ [Abfragen mit Fenstern](windowed-sql.md)
+ [Operationen für Streaming-Daten: Zusammenführen von Streams](stream-joins-concepts.md)



# In-Application-Streams und Pumps
<a name="streams-pumps"></a>

Wenn Sie die [Anwendungseingabe](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html) konfigurieren, wird eine Streaming-Quelle einem erstellten In-Application-Stream zugeordnet. Die Daten fließen kontinuierlich aus der Streaming-Quelle in den In-Application-Stream. Ein In-Application-Stream funktioniert wie eine Tabelle, die Sie mit SQL-Anweisungen abfragen können, wird jedoch als Stream bezeichnet, da die Daten kontinuierlich fließen. 

**Anmerkung**  
Verwechseln Sie In-Application-Streams nicht mit Amazon Kinesis Kinesis-Datenströmen und Firehose-Lieferströmen. In-Application-Streams sind nur im Kontext einer Amazon-Kinesis-Data-Analytics-Anwendung vorhanden. Kinesis-Datenströme und Firehose-Lieferströme existieren unabhängig von Ihrer Anwendung. Sie können sie in der Konfiguration Ihrer Anwendungseingabe als Streaming-Quelle oder in der Ausgabekonfiguration als Ziel konfigurieren.

Sie können außerdem bei Bedarf weitere In-Application-Streams erstellen, um Zwischenergebnisse aus Abfragen zu speichern. Das Erstellen eines In-Application-Streams ist ein zweistufiger Prozess. Zuerst erstellen Sie einen In-Application-Stream. Anschließend pumpen Sie Daten in diesen. Angenommen, die Eingabekonfiguration Ihrer Anwendung erstellt einen In-Application-Stream mit dem Namen `INPUTSTREAM`. Im folgenden Beispiel erstellen Sie einen anderen Stream (`TEMPSTREAM`) und pumpen anschließend Daten aus `INPUTSTREAM` in diesen. 

1. Erstellen Sie einen In-Application-Stream (`TEMPSTREAM`) mit drei Spalten, wie im Folgenden gezeigt:

   ```
   CREATE OR REPLACE STREAM "TEMPSTREAM" ( 
      "column1" BIGINT NOT NULL, 
      "column2" INTEGER, 
      "column3" VARCHAR(64));
   ```

   Die Spaltennamen werden in Anführungszeichen angegeben, wodurch zwischen Groß- und Kleinschreibung unterschieden wird. Weitere Informationen finden Sie im Abschnitt [Kennungen](https://docs.aws.amazon.com/kinesisanalytics/latest/sqlref/sql-reference-identifiers.html) in der *SQL-Referenz zu Amazon-Kinesis-Data-Analytics*.

1. Fügen Sie mittels eines Pumps Daten in den Stream ein. Eine Pump ist eine kontinuierlich ausgeführte Einfüge-Abfrage, die Daten aus einem In-Application-Stream in einen anderen In-Application-Stream einfügt. Die folgende Anweisung erstellt eine Pump (`SAMPLEPUMP`) und fügt Daten in den `TEMPSTREAM` ein, indem sie Datensätze aus einem anderen Stream (`INPUTSTREAM`) auswählt.

   ```
   CREATE OR REPLACE PUMP "SAMPLEPUMP" AS 
   INSERT INTO "TEMPSTREAM" ("column1", 
                             "column2", 
                             "column3") 
   SELECT STREAM inputcolumn1, 
                 inputcolumn2, 
                 inputcolumn3
   FROM "INPUTSTREAM";
   ```

Sie können in einen In-Application-Stream aus mehreren Quellen schreiben und es können mehrere Datensätze aus einem Stream ausgewählt werden. Stellen Sie sich einen In-Application-Stream als Implementierung eines publish/subscribe Messaging-Paradigmas vor. In diesem Paradigma kann eine Datenzeile, einschließlich Erstellungs- und Empfangszeitpunkt, durch eine Kaskade von SQL-Streaming-Anweisungen verarbeitet, interpretiert und weitergeleitet werden, ohne in einem herkömmlichen RDBMS gespeichert werden zu müssen.

Nachdem ein In-Application-Stream erstellt wurde, können Sie normale SQL-Abfragen ausführen. 

**Anmerkung**  
Bei der Abfrage von Streams müssen die meisten SQL-Anweisungen ein zeilen- oder zeitbasiertes Fenster verwenden. Weitere Informationen finden Sie unter [Abfragen mit Fenstern](windowed-sql.md).

Sie können Streams auch zusammenfügen. Beispiele für das Zusammenfügen von Streams finden Sie unter [Operationen für Streaming-Daten: Zusammenführen von Streams](stream-joins-concepts.md).

# Zeitstempel und die ROWTIME-Spalte
<a name="timestamps-rowtime-concepts"></a>

In-Application-Streams enthalten eine spezielle Spalte namens `ROWTIME`. In dieser wird ein Zeitstempel gespeichert, wenn Amazon-Kinesis-Data-Analytics eine Zeile in den ersten In-Application-Stream einfügt. `ROWTIME` spiegelt den Zeitstempel wider, zu dem Amazon-Kinesis-Data-Analytics nach dem Lesen aus der Streaming-Quelle einen Datensatz in den ersten In-Application-Stream eingefügt hat. Dieser `ROWTIME`-Wert wird anschließend in der gesamten Anwendung beibehalten. 

**Anmerkung**  
Wenn Sie Datensätze aus einem In-Application-Stream in einen anderen pumpen, müssen Sie die Spalte `ROWTIME` nicht explizit kopieren. Amazon-Kinesis-Data-Analytics kopiert diese Spalte für Sie.

Amazon-Kinesis-Data-Analytics stellt sicher, dass die `ROWTIME`-Werte gleichmäßig erhöht werden. Sie verwenden diesen Zeitstempel in Abfragen mit Fenstern auf Zeitbasis. Weitere Informationen finden Sie unter [Abfragen mit Fenstern](windowed-sql.md).

Sie können die Spalte ROWTIME in Ihrer `SELECT`-Anweisung wie jede andere Spalte in Ihrem In-Application-Stream aufrufen. Beispiel:

```
SELECT STREAM ROWTIME, 
              some_col_1, 
              some_col_2
FROM  SOURCE_SQL_STREAM_001
```

## Verstehen der verschiedenen Zeiten in Streaming-Analysen
<a name="out-of-order-rows"></a>

Zusätzlich zu `ROWTIME` gibt es weitere Arten von Zeiten in Echtzeit-Streaming-Anwendungen. Dies sind:
+ **Ereigniszeit** – Der Zeitstempel für den Zeitpunkt, an dem das Ereignis aufgetreten ist. Dies wird manchmal auch die *clientseitige Zeit* genannt. Häufig ist es wünschenswert, diese Zeit in Analysen zu verwenden, da dies die Zeit ist, zu der ein Ereignis aufgetreten ist. Zahlreiche Ereignisquellen, wie Smartphones und Web-Clients, besitzen jedoch keine zuverlässigen Uhren, was zu ungenauen Zeiten führen kann. Zusätzlich können Konnektivitätsprobleme dazu führen, dass Datensätze in einem Stream nicht in der gleichen Reihenfolge angezeigt werden, in der sie aufgetreten sind.

   
+ **Aufnahmezeit** – Der Zeitstempel für den Zeitpunkt, an dem ein Datensatz der Streaming-Quelle hinzugefügt wurde. Amazon-Kinesis-Data-Streams enthalten in jedem Datensatz ein Feld namens `APPROXIMATE_ARRIVAL_TIME`, das diesen Zeitstempel bereitstellt. Dies wird manchmal auch als *serverseitige Zeit* bezeichnet. Diese Aufnahmezeit ist häufig eine nahe Annäherung an die Ereigniszeit. Wenn es eine Verzögerung bei der Aufnahme des Datensatzes in den Stream gibt, kann dies zu Ungenauigkeiten führen, was in der Regel selten ist. Die Aufnahmezeit ist selten nicht in der richtigen Reihenfolge, auch wenn dies aufgrund der verteilten Natur von Streaming-Daten vorkommen kann. Daher reflektiert die Aufnahmezeit die Ereigniszeit meistens genau und in der richtigen Reihenfolge. 

   
+ **Verarbeitungszeit** – Der Zeitstempel für den Zeitpunkt, an dem Amazon-Kinesis-Data-Analytics eine Zeile in den ersten In-Application-Stream einfügt. Amazon-Kinesis-Data-Analytics stellt diesen Zeitstempel in der Spalte `ROWTIME` bereit, die in jedem In-Application-Stream vorhanden ist. Die Verarbeitungszeit wird stets gleichmäßig erhöht. Sie ist jedoch nicht genau, wenn Ihre Anwendung hinter das Schreiben von Daten zurückfällt. (Wenn eine Anwendung zurückfällt, gibt die Verarbeitungszeit die Ereigniszeit nicht genau wieder.) Diese `ROWTIME` ist in Bezug auf die Uhr zwar sehr genau, stellt möglicherweise jedoch nicht die Zeit dar, zu der das Ereignis tatsächlich aufgetreten ist. 

Die Verwendung dieser Zeiten in Abfragen mit Fenstern auf Zeitbasis hat Vor- und Nachteile. Wir empfehlen, mindestens eine dieser Zeiten zu wählen und je nach Anwendungsfall eine Strategie für den Umgang mit den relevanten Nachteilen zu entwickeln. 

**Anmerkung**  
Wenn Sie Fenster auf Zeilenbasis verwenden, stellt Zeit kein Problem dar und Sie können diesen Abschnitt ignorieren.

Wir empfehlen, eine Zwei-Fenster-Strategie, die zwei Fenster auf Zeitbasis verwendet, sowohl `ROWTIME` und eine der beiden anderen Zeiten (Aufnahme- oder Ereigniszeit). 
+ Sie sollten `ROWTIME` als erstes Fenster verwenden, das die Häufigkeit steuert, mit der die Abfrage die Ergebnisse ausgibt, wie im folgenden Beispiel gezeigt. Sie wird nicht als logische Zeit verwendet.
+ Sie sollten eine der beiden anderen Zeiten als logische Zeit verwenden, um sie mit Ihren Analysen zu verknüpfen. Diese Zeit stellt den Zeitpunkt dar, zu dem das Ereignis aufgetreten ist. Im folgenden Beispiel besteht das Ziel der Analyse darin, die Datensätze zu gruppieren und eine Zahl nach Ticker zurückzugeben.

Der Vorteil dieser Strategie besteht darin, dass eine Zeit verwendet werden kann, die den Zeitpunkt angibt, zu dem das Ereignis aufgetreten ist. Auch treten mit dieser Strategie keinerlei Probleme auf, wenn Ihre Anwendung zurückfällt oder Ereignisse nicht in der richtigen Reihenfolge eintreffen. Wenn die Anwendung zurückfällt, wenn Datensätze in den In-Application-Stream eingefügt werden, werden sie dennoch von der logischen Zeit im zweiten Fenster gruppiert. Die Abfrage verwendet `ROWTIME`, um die Reihenfolge der Verarbeitung zu gewährleisten. Datensätze, die verspätet eintreffen (der Aufnahmezeitstempel zeigt im Vergleich zum `ROWTIME`-Wert einen früheren Wert an), werden ebenfalls erfolgreich verarbeitet.

Betrachten Sie die folgende Abfrage für den in der [Erste Schritte](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)-Übung verwendeten Demo-Stream. Die Abfrage verwendet die `GROUP BY`-Klausel und gibt die Tickerzahl innerhalb eines rollierenden Zeitfensters von einer Minute an. 

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" 
    ("ingest_time"    timestamp,
    "APPROXIMATE_ARRIVAL_TIME" timestamp,
    "ticker_symbol"  VARCHAR(12), 
    "symbol_count"        integer);
            
            
CREATE OR REPLACE PUMP "STREAM_PUMP" AS
    INSERT INTO "DESTINATION_SQL_STREAM"
    SELECT STREAM STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND) AS "ingest_time",
        STEP("SOURCE_SQL_STREAM_001".APPROXIMATE_ARRIVAL_TIME BY INTERVAL '60' SECOND) AS "APPROXIMATE_ARRIVAL_TIME",
        "TICKER_SYMBOL",
        COUNT(*) AS "symbol_count"
    FROM "SOURCE_SQL_STREAM_001"
    GROUP BY "TICKER_SYMBOL",
        STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND),
        STEP("SOURCE_SQL_STREAM_001".APPROXIMATE_ARRIVAL_TIME BY INTERVAL '60' SECOND);
```

In `GROUP BY` gruppieren Sie die Datensätze zunächst anhand der `ROWTIME` in einem Zeitfenster von einer Minute und anschließend nach `APPROXIMATE_ARRIVAL_TIME`.

Die Zeitstempelwerte im Ergebnis werden auf das nächste 60-Sekunden-Intervall gerundet. Die erste von der Abfrage ausgegebene Ergebnisgruppe zeigt Datensätze in der ersten Minute an. Die zweite Gruppe von ausgegebenen Ergebnissen zeigt Datensätze in den nächsten Minuten an, basierend auf `ROWTIME`. Der letzte Datensatz gibt an, dass die Anwendung den Datensatz verspätet in den In-Application-Stream aufgenommen hat(sie zeigt im Vergleich zum Aufnahmezeitstempel einen verspäteten `ROWTIME`-Wert an).

```
ROWTIME                  INGEST_TIME     TICKER_SYMBOL  SYMBOL_COUNT

--First one minute window.
2016-07-19 17:05:00.0    2016-07-19 17:05:00.0    ABC      10
2016-07-19 17:05:00.0    2016-07-19 17:05:00.0    DEF      15
2016-07-19 17:05:00.0    2016-07-19 17:05:00.0    XYZ      6
–-Second one minute window.
2016-07-19 17:06:00.0    2016-07-19 17:06:00.0    ABC      11
2016-07-19 17:06:00.0    2016-07-19 17:06:00.0    DEF      11
2016-07-19 17:06:00.0    2016-07-19 17:05:00.0    XYZ      1  *** 

***late-arriving record, instead of appearing in the result of the 
first 1-minute windows (based on ingest_time, it is in the result 
of the second 1-minute window.
```

Sie können die Ergebnisse kombinieren, um eine endgültige genaue Zahl pro Minute zu erhalten, indem die Ergebnisse zu einer Downstream-Datenbank verschoben werden. Sie können die Anwendungsausgabe beispielsweise so konfigurieren, dass die Ergebnisse in einem Firehose-Lieferdatenstrom gespeichert werden, der in eine Amazon Redshift Redshift-Tabelle schreiben kann. Wenn sich die Ergebnisse in einer Amazon-Redshift-Tabelle befinden, können Sie eine Tabellenabfrage durchführen, um die gesamte Zahl für die Gruppe nach `Ticker_Symbol` zu berechnen. Im Fall von `XYZ` ist die Gesamtzahl genau (6\$11), obwohl ein Datensatz spät eingetroffen ist.

# Kontinuierliche Abfragen
<a name="continuous-queries-concepts"></a>

Eine Abfrage über einen Stream wird kontinuierlich über Streaming-Daten ausgeführt. Diese kontinuierliche Ausführung ermöglicht Szenarien wie die Fähigkeit von Anwendungen, einen Stream kontinuierlich abzufragen und Warnungen zu generieren. 

In der Einführungsübung gibt es einen In-Application-Stream namens `SOURCE_SQL_STREAM_001`. Dieser erhält kontinuierlich Aktienpreise aus einem Demo-Stream (einem Kinesis-Datenstrom). Das Schema ist wie folgt:

```
(TICKER_SYMBOL VARCHAR(4), 
 SECTOR varchar(16), 
 CHANGE REAL, 
 PRICE REAL)
```

Angenommen, Sie sind an Aktienpreisänderungen von mehr als 15 % interessiert. Sie können in Ihrem Anwendungscode die folgende Abfrage verwenden. Diese Abfrage wird kontinuierlich ausgeführt und gibt Datensätze aus, wenn eine Aktienpreisänderung von mehr als 15 % entdeckt wird.

```
SELECT STREAM TICKER_SYMBOL, PRICE 
      FROM   "SOURCE_SQL_STREAM_001"
      WHERE  (ABS((CHANGE / (PRICE-CHANGE)) * 100)) > 15
```

Verwenden Sie das folgende Verfahren, um eine Amazon-Kinesis-Data-Analytics-Anwendung einzurichten und diese Abfrage zu testen.

**So testen Sie die Abfrage**

1. Erstellen Sie eine Anwendung mit der [Erste Schritte](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)-Übung.

1. Ersetzen Sie die `SELECT`-Anweisung im Anwendungscode durch die vorherige `SELECT`-Abfrage. Der resultierende Anwendungscode wird im Folgenden gezeigt:

   ```
   CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (ticker_symbol VARCHAR(4), 
                                                      price DOUBLE);
   -- CREATE OR REPLACE PUMP to insert into output
   CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
     INSERT INTO "DESTINATION_SQL_STREAM" 
         SELECT STREAM TICKER_SYMBOL, 
                       PRICE 
         FROM   "SOURCE_SQL_STREAM_001"
         WHERE  (ABS((CHANGE / (PRICE-CHANGE)) * 100)) > 15;
   ```

# Abfragen mit Fenstern
<a name="windowed-sql"></a>

SQL-Abfragen in Ihrem Anwendungscode werden kontinuierlich über In-Application-Streams ausgeführt. Ein In-Application-Stream entspricht einer unbegrenzten Menge von Daten, die kontinuierlich durch Ihre Anwendung fließen. Um daher aus dieser kontinuierlich aktualisierten Eingabe Ergebnissätze zu erhalten, werden Abfragen häufig durch ein Fenster begrenzt, das auf Zeit- oder Zeilenbasis definiert wird. Diese Fenster werden auch als *Fenster-SQL* bezeichnet. 

Für eine Abfrage mit einem Fenster auf Zeitbasis geben Sie die Fenstergröße in Bezug auf die Zeit an (beispielsweise ein Fenster von einer Minute). Dies erfordert in Ihrem In-Application-Stream eine Zeitstempelspalte, die gleichmäßig erhöht wird. (Der Zeitstempel für eine neue Zeile ist größer oder gleich groß wie der der vorherigen Zeile.) Amazon-Kinesis-Data-Analytics stellt für jeden In-Application-Stream eine solche Zeitstempelspalte bereit; diese hat den Namen `ROWTIME`. Sie können diese Spalte verwenden, wenn Sie Abfragen auf Zeitbasis angeben. Für Ihre Anwendung wählen Sie möglicherweise eine andere Zeitstempeloption. Weitere Informationen finden Sie unter [Zeitstempel und die ROWTIME-Spalte](timestamps-rowtime-concepts.md).

Bei einer Abfrage mit einem Fenster auf Zeilenbasis geben Sie die Größe des Fensters in Bezug auf die Anzahl der Zeilen an.

Sie können eine Abfrage so angeben, dass Datensätze in einem rollierenden, gleitenden oder versetzten Fenster verarbeitet werden, abhängig von den Anforderungen Ihrer Anwendung. Kinesis Data Analytics unterstützt die folgenden Fenstertypen:
+ [Versetzte Fenster](stagger-window-concepts.md): Eine Abfrage, die Daten unter Verwendung zeitbasierter Fenster mit Schlüsseln aggregiert, die bei Erhalt der Daten geöffnet werden. Die Schlüssel ermöglichen die Nutzung mehrerer überlappender Fenster. Dies ist die empfohlene Methode, um Daten mithilfe zeitbasierter Fenster zu aggregieren, da Stagger-Fenster im Vergleich zu Tumbling-Fenstern verspätete out-of-order Daten reduzieren.
+ [Rollierende Fenster](tumbling-window-concepts.md): Eine Abfrage, die Daten unter Verwendung unterschiedlicher zeitbasierter Fenster aggregiert, die in regelmäßigen Abständen geöffnet und geschlossen werden.
+ [Gleitende Fenster](sliding-window-concepts.md): Eine Abfrage, die Daten kontinuierlich unter Verwendung eines festen Zeit- oder eines rowcount-Intervalls aggregiert.

# Versetzte Fenster
<a name="stagger-window-concepts"></a>

Das Verwenden von *Versetzte Fenster* ist eine Methode zur Anordnung von Fenstern für die Analyse von Datengruppen, die ungleichmäßig eingehen. Diese Methode eignet sich für beliebige Zeitreihenanalysen, z. B. für eine Gruppe zusammengehöriger Verkaufs- oder Protokolldatensätze.

Beispiel: [VPC Flow Logs](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-logs-limitations) haben einen Erfassungszeitraum von ca. 10 Minuten. Sie können jedoch einen Erfassungszeitraum von bis zu 15 Minuten aufweisen, wenn das Aggregieren von Daten auf dem Client erfolgt. Versetzte Fenster eignen sich ideal, um diese Protokolle zu Analysezwecken zu aggregieren.

Versetzte Fenster lösen das Problem, das auftritt, wenn zusammengehörige Datensätze nicht in dasselbe zeitbeschränkte Fenster fallen (beispielsweise bei Verwendung rollierender Fenster).

## Teilergebnisse mit rollierenden Fenstern
<a name="stagger-window-tumbling"></a>

Es gibt bestimmte Einschränkungen bei der Verwendung [Rollierende Fenster](tumbling-window-concepts.md) für die Aggregation von verspäteten out-of-order Daten.

Wenn rollierende Fenster zum Analysieren von Gruppen zeitversetzter Daten verwendet werden, fallen die einzelnen Datensätze möglicherweise in unterschiedliche Fenster. Daher müssen die Teilergebnisse jedes Fensters zu einem späteren Zeitpunkt kombiniert werden, um vollständige Ergebnisse für jede Gruppe von Datensätzen anzuzeigen. 

In der folgenden Abfrage für rollierende Fenster werden Datensätze nach Zeilenzeit, Ereigniszeit und Tickersymbol in Fenstern gruppiert:

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    TICKER_SYMBOL VARCHAR(4),
    EVENT_TIME timestamp,
    TICKER_COUNT     DOUBLE);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
  INSERT INTO "DESTINATION_SQL_STREAM" 
    SELECT STREAM 
        TICKER_SYMBOL,
        FLOOR(EVENT_TIME TO MINUTE),
        COUNT(TICKER_SYMBOL) AS TICKER_COUNT
    FROM "SOURCE_SQL_STREAM_001"
    GROUP BY ticker_symbol, FLOOR(EVENT_TIME TO MINUTE), STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '1' MINUTE);
```

In der folgenden Abbildung zählt eine Anwendung die empfangenen Handelstransaktionen basierend auf dem Zeitpunkt der Transaktionen (Ereigniszeit) minutenweise. Die Anwendung kann ein rollierendes Fenster zum Gruppieren der Daten basierend auf Zeilenzeit und Ereigniszeit verwenden. Die Anwendung empfängt vier Datensätze, die alle innerhalb einer Minute eintreffen. Die Anwendung gruppiert die Datensätze nach Zeilenzeit, Ereigniszeit und Tickersymbol. Da einige der Datensätze nach dem Ende des ersten rollierenden Fensters ankommen, fallen nicht alle Datensätze in dasselbe rollierende Ein-Minuten-Fenster.

![\[Tumbling windows diagram showing data grouping by row time, event time, and ticker symbol over two minutes.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/stagger_0.png)


Das vorhergehende Diagramm enthält die folgenden Ereignisse:


****  

| ROWTIME | EVENT\$1TIME | TICKER\$1SYMBOL | 
| --- | --- | --- | 
| 11:00:20 | 11:00:10 | AMZN | 
| 11:00:30 | 11:00:20 | AMZN | 
| 11:01:05 | 11:00:55 | AMZN | 
| 11:01:15 | 11:01:05 | AMZN | 

Die Ergebnismenge der Anwendung mit rollierendem Fenster ähnelt der folgenden.


****  

| ROWTIME | EVENT\$1TIME | TICKER\$1SYMBOL | COUNT | 
| --- | --- | --- | --- | 
| 11:01:00 | 11:00:00 | AMZN | 2  | 
| 11:02:00 | 11:00:00 | AMZN | 1  | 
| 11:02:00 | 11:01:00 | AMZN | 1  | 

In der Ergebnismenge werden drei Ergebnisse zurückgegeben:
+ Ein Datensatz mit einem `ROWTIME`-Wert von 11:01:00, der die ersten zwei Datensätze aggregiert.
+ Ein Datensatz um 11:02:00, der nur den dritten Datensatz aggregiert. Dieser Datensatz weist einen `ROWTIME`-Wert im zweiten Fenster, aber einen `EVENT_TIME`-Wert im ersten Fenster auf.
+ Ein Datensatz um 11:02:00, der nur den vierten Datensatz aggregiert.

Zum Analysieren der vollständigen Ergebnismenge müssen die Datensätze im persistenten Speicher aggregiert werden. Dadurch wachsen Komplexität und Verarbeitungsanforderungen der Anwendung.

## Vollständige Ergebnisse mit versetzten Fenstern
<a name="stagger-window-concepts-stagger"></a>

Zur Verbesserung der Genauigkeit bei der Analyse zeitbezogener Datensätze stellt Kinesis Data Analytics einen neuen Fenstertyp mit der Bezeichnung *Versetzte Fenster* bereit. Fenster dieses Typs werden geöffnet, wenn das erste Ereignis mit übereinstimmendem Partitionsschlüssel ankommt, nicht für einen festen Zeitraum. Die Fenster werden basierend auf dem angegebenen Alter geschlossen, das ab dem Zeitpunkt gemessen wird, zu dem das Fenster geöffnet wird.

Ein versetztes Fenster ist ein separates zeitbeschränktes Fenster für jede Schlüsselgruppierung in einer WINDOW-Klausel. Die Anwendung aggregiert jedes Ergebnis der WINDOW-Klausel im eigenen Zeitfenster, statt ein einzelnes Fenster für alle Ergebnisse zu verwenden.

In der folgenden Abfrage für versetzte Fenster werden Datensätze nach Ereigniszeit und Tickersymbol in Fenstern gruppiert:

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    ticker_symbol    VARCHAR(4), 
    event_time       TIMESTAMP,
    ticker_count     DOUBLE);

CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
  INSERT INTO "DESTINATION_SQL_STREAM" 
    SELECT STREAM 
        TICKER_SYMBOL,
        FLOOR(EVENT_TIME TO MINUTE),
        COUNT(TICKER_SYMBOL) AS ticker_count
    FROM "SOURCE_SQL_STREAM_001"
    WINDOWED BY STAGGER (
            PARTITION BY FLOOR(EVENT_TIME TO MINUTE), TICKER_SYMBOL RANGE INTERVAL '1' MINUTE);
```

Im folgenden Diagramm werden Ereignisse nach Ereigniszeit und Tickersymbol in versetzten Fenstern gruppiert.

![\[Diagram showing event aggregation into stagger windows by event time and ticker symbol.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/stagger_1.png)


Das vorstehende Diagramm umfasst die folgenden Ereignisse, die denen entsprechen, die mit der Anwendung mit rollierenden Fenstern analysiert wurden:


****  

| ROWTIME | EVENT\$1TIME | TICKER\$1SYMBOL | 
| --- | --- | --- | 
| 11:00:20 | 11:00:10 | AMZN | 
| 11:00:30 | 11:00:20 | AMZN | 
| 11:01:05 | 11:00:55 | AMZN | 
| 11:01:15 | 11:01:05 | AMZN | 

Die Ergebnismenge der Anwendung für versetzte Fenster ähnelt der folgenden.


****  

| ROWTIME | EVENT\$1TIME | TICKER\$1SYMBOL | Anzahl | 
| --- | --- | --- | --- | 
| 11:01:20 | 11:00:00 | AMZN | 3 | 
| 11:02:15 | 11:01:00 | AMZN | 1 | 

Der zurückgegebene Datensatz aggregiert die ersten drei Eingabedatensätze. Die Datensätze werden nach versetzten Eine-Minute-Fenstern gruppiert. Das versetzte Fenster startet, wenn die Anwendung den ersten AMZN-Datensatz (mit einem `ROWTIME`-Wert von 11:00:20) empfängt. Wenn das versetzte Eine-Minute-Fenster abläuft (um 11:01:20), wird ein Datensatz mit den Ergebnissen, die in das versetzte Fenster fallen (basierend auf `ROWTIME` und `EVENT_TIME`), in den Ausgabe-Stream geschrieben. Bei Verwendung eines versetzten Fensters werden alle Datensätze mit `ROWTIME`- und `EVENT_TIME`-Werten innerhalb eines Eine-Minute-Fensters in einem einzelnen Ergebnis ausgegeben.

Der letzte Datensatz (mit einer `EVENT_TIME` außerhalb der einminütigen Aggregation) wird separat aggregiert. Dies liegt daran, dass `EVENT_TIME` einen der Partitionsschlüssel darstellt, mit dem die Datensätze in Ergebnissätze eingeteilt werden, und der Partitionsschlüssel für die `EVENT_TIME` des ersten Fensters `11:00` ist.

Die Syntax für versetzte Fenster wird in einer speziellen `WINDOWED BY`-Klausel definiert. Diese Klausel wird anstelle der `GROUP BY`-Klausel für Streaming-Aggregationen verwendet. Die Klausel folgt unmittelbar auf die optionale `WHERE`-Klausel und steht vor der `HAVING`-Klausel. 

Das versetzte Fenster wird in der `WINDOWED BY`-Klausel definiert und nimmt zwei Parameter an: Partitionsschlüssel und Fensterdauer. Der Partitionsschlüssel partitioniert den eingehenden Daten-Stream und definiert, wann das Fenster geöffnet wird. Ein versetztes Fenster wird geöffnet, sobald das erste Ereignis mit eindeutigem Partitionsschlüssel im Stream auftritt. Das versetzte Fenster schließt nach einem festen Zeitraum, der als Fensterdauer definiert ist. Die Syntax wird im folgenden Codebeispiel veranschaulicht:

```
...
FROM <stream-name>
WHERE <... optional statements...>
WINDOWED BY STAGGER(
	PARTITION BY <partition key(s)>
	RANGE INTERVAL <window length, interval>
);
```

# Rollierende Fenster (Zusammenfassungen mit GROUP BY)
<a name="tumbling-window-concepts"></a>

Wenn eine Abfrage mit Fenster jedes Fenster so verarbeitet, dass diese sich nicht überschneiden, wird das Fenster als *rollierendes Fenster* bezeichnet. In diesem Fall gehört jeder Datensatz in einem In-Application-Stream zu einem bestimmten Fenster. Er wird nur einmal verarbeitet (wenn die Abfrage das Fenster verarbeitet, zu dem der Datensatz gehört).

![\[Timeline showing non-overlapping windows processing data streams at distinct time intervals.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/window-tumbling-20.png)


Beispielsweise verarbeitet eine Zusammenfassungsabfrage, die eine `GROUP BY`-Klausel verwendet, Zeilen in einem rollierenden Fenster. Der Demo-Stream in der [Erste Schritte](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)-Übung empfängt Aktienpreisdaten, die dem In-Application-Stream `SOURCE_SQL_STREAM_001` in Ihrer Anwendung zugeordnet sind. Dieser Stream weist das folgende Schema auf.

```
(TICKER_SYMBOL VARCHAR(4), 
 SECTOR varchar(16), 
 CHANGE REAL, 
 PRICE REAL)
```

Angenommen, Sie möchten in Ihrem Anwendungscode zusammengefasste Mindest-/Höchstpreise für jeden Ticker im Zeitraum von einer Minute finden. Sie können die folgende Abfrage verwenden.

```
SELECT STREAM ROWTIME,
              Ticker_Symbol,
              MIN(Price) AS Price,
              MAX(Price) AS Price
FROM     "SOURCE_SQL_STREAM_001"
GROUP BY Ticker_Symbol, 
         STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);
```

Das vorherige Beispiel ist eine Abfrage mit Fenster auf Zeitbasis. Die Abfrage gruppiert Datensätze nach `ROWTIME`-Werten. Für Berichte auf Minutenbasis rundet die Funktion `STEP` die `ROWTIME`-Werte auf die nächste Minute ab. 

**Anmerkung**  
Sie können auch die `FLOOR`-Funktion verwenden, um Datensätze in Fenstern zu gruppieren. Die Funktion `FLOOR` kann Zeitwerte jedoch nur auf eine gesamte Zeiteinheit (Stunde, Minute, Sekunde usw.) abrunden. `STEP` wird für die Gruppierung von Datensätzen in rollierende Zeitfenster empfohlen, da hierdurch Werte auf ein beliebiges Intervall, z. B. 30 Sekunden, abgerundet werden können.

Diese Abfrage ist ein Beispiel für ein nicht überschneidendes (rollierendes) Fenster. Die `GROUP BY`-Klausel gruppiert Datensätze in einem Fenster von einer Minute. Jeder Datensatz gehört zu einem bestimmten Fenster (keine Überschneidungen). Die Abfrage gibt einen Ausgabedatensatz pro Minute aus, der den in der jeweiligen Minute aufgezeichneten min/max Tickerpreis angibt. Diese Art von Abfrage ist nützlich, um aus dem Eingabedaten-Stream regelmäßige Berichte zu generieren. In diesem Beispiel werden jede Minute Berichte generiert. 

**So testen Sie die Abfrage**

1. Richten Sie anhand der [Erste Schritte](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)-Übung eine Anwendung ein.

1. Ersetzen Sie die `SELECT`-Anweisung im Anwendungscode durch die vorherige `SELECT`-Abfrage. Der resultierende Anwendungscode wird im Folgenden gezeigt:

   ```
   CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
                                      ticker_symbol VARCHAR(4), 
                                      Min_Price     DOUBLE, 
                                      Max_Price     DOUBLE);
   -- CREATE OR REPLACE PUMP to insert into output
   CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
     INSERT INTO "DESTINATION_SQL_STREAM" 
       SELECT STREAM Ticker_Symbol,
                     MIN(Price) AS Min_Price,
                     MAX(Price) AS Max_Price
       FROM    "SOURCE_SQL_STREAM_001"
       GROUP BY Ticker_Symbol, 
                STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);
   ```

# Gleitende Fenster
<a name="sliding-window-concepts"></a>

Statt Datensätze mittels `GROUP BY` zu gruppieren, können Sie ein Fenster auf Zeit- oder Zeilenbasis definieren. Sie führen dies aus, indem Sie eine explizite `WINDOW`-Klausel hinzufügen. 

In diesem Fall gibt Amazon-Kinesis-Data-Analytics eine Ausgabe aus, während das Fenster über die Zeit gleitet und neue Datensätze im Stream angezeigt werden. Kinesis Data Analytics gibt diese Ausgabe aus, indem Zeilen im Fenster verarbeitet werden. Bei der Art der Verarbeitung können sich Fenster überschneiden; ein Datensatz kann Teil mehrerer Fenster sein und wird mit jeden Fenster verarbeitet. Das folgende Beispiel zeigt ein gleitendes Fenster.

Betrachten Sie eine einfache Abfrage, die Datensätze im Stream zählt. Dieses Beispiel setzt ein 5-Sekunden-Fenster voraus. Im folgenden Beispiel-Stream treffen neue Datensätze zu den Zeitpunkten t1, t2, t6 und t7 ein. Drei Datensätze treffen zum Zeitpunkt t8 Sekunden ein.

![\[Timeline showing record arrivals at t1, t2, t6, t7, and multiple at t8 within a 5-second window.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-10.png)


Beachten Sie Folgendes:
+ Das Beispiel setzt ein 5-Sekunden-Fenster voraus. Das Fenster von 5 Sekunden gleitet kontinuierlich über die Zeit. 
+ Für jede Zeile, die in ein Fenster eintritt, wird vom gleitenden Fenster eine Ausgabezeile ausgegeben. Direkt nach dem Start der Anwendung wird Ihnen die Abfrageausgabe für jeden neuen Datensatz angezeigt, der im Stream angezeigt wird, auch wenn ein bestimmtes 5-Sekunden-Fenster noch nicht verstrichen ist. Die Abfrage gibt beispielsweise eine Ausgabe aus, wenn ein Datensatz in der ersten und zweiten Sekunde eintrifft. Später verarbeitet die Abfrage Datensätze im 5-Sekunden-Fenster.
+ Die Fenster gleiten mit der Zeit. Wenn ein alter Datensatz im Stream aus dem Fenster herausfällt, gibt die Abfrage keine Ausgabe aus, es sei denn, es gibt auch einen neuen Datensatz im Stream, der in dieses 5-Sekunden-Fenster fällt.

  

Angenommen, die Abfrage wird zum Zeitpunkt t0 gestartet. Dann geschieht Folgendes:

1. Zum Zeitpunkt t0 startet die Abfrage. Die Abfrage gibt keine Ausgabe (Zählwert) aus, da es zu diesem Zeitpunkt keine Datensätze gibt.  
![\[Timeline showing a stream starting at t0 with no output initially indicated.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t0.png)

1. Zum Zeitpunkt t1 trifft ein neuer Datensatz im Stream ein und die Abfrage gibt den Zählwert 1 aus.   
![\[Timeline showing a stream with a record appearing at time t1, and an arrow pointing to t0.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t1.png)

1. Zum Zeitpunkt t2 trifft ein weiterer Datensatz ein und die Abfrage gibt den Zählwert 2 aus.   
![\[Timeline showing stream events at different time points, with two vertical bars at the end.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t2.png)

1. Das 5-Sekunden-Fenster gleitet mit der Zeit:
   + Zum Zeitpunkt t3, das gleitende Fenster von t3 zu t0
   + Zum Zeitpunkt t4 (das gleitende Fenster von t4 zu t0)
   + Zum Zeitpunkt t5, das gleitetende Fenster von t5 zu t0.

   Zu all diesen Zeitpunkten besitzt das 5-Sekunden-Fenster dieselben Datensätze – es gibt keine neuen Datensätze. Daher gibt die Abfrage keine Ausgabe aus.  
![\[Timeline showing stream with multiple time points and colored rectangles representing data windows.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t3-4-5.png)

1. Zum Zeitpunkt t6 liegt das 5-Sekunden-Fenster zwischen t6 und t1. Die Abfrage erkennt einen einzelnen neuen Datensatz bei t6 und gibt daher als Ausgabe 2 aus. Der Datensatz bei t1 liegt nicht mehr im Fenster und wird nicht gezählt.   
![\[Timeline showing stream events at different time points with a sliding 5-second window.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t6.png)

1. Zum Zeitpunkt t7 liegt das 5-Sekunden-Fenster zwischen t7 und t2. Die Abfrage erkennt einen einzelnen neuen Datensatz bei t7 und gibt daher als Ausgabe 2 aus. Der Datensatz liegt zum Zeitpunkt t2 nicht mehr im 5-Sekunden-Fenster und wird daher nicht gezählt.   
![\[Timeline showing stream events and time points from t0 to t7, with a 5-second window highlighted.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t7.png)

1. Zum Zeitpunkt t8 liegt das 5-Sekunden-Fenster zwischen t8 und t3. Die Abfrage erkennt drei neue Datensätze und gibt daher die Datensatzzahl 5 aus.  
![\[Timeline showing stream events with orange bars representing record counts at different time intervals.\]](http://docs.aws.amazon.com/de_de/kinesisanalytics/latest/dev/images/sliding-t8.png)

Zusammenfassend kann gesagt werden, dass das Fenster eine feste Größe hat und mit der Zeit gleitet. Die Abfrage gibt eine Ausgabe aus, wenn neue Datensätze angezeigt werden. 

**Anmerkung**  
Wir empfehlen, keine gleitenden Fenster zu verwenden, die länger als eine Stunde sind. Wenn Sie ein längeres Fenster verwenden, nimmt der Neustart der Anwendung nach einer regulären Systemwartung mehr Zeit in Anspruch. Dies liegt daran, dass die Quelldaten erneut aus dem Stream gelesen werden müssen.

In den folgenden Beispielabfragen wird die `WINDOW`-Klausel verwendet, um Fenster zu definieren und Zusammenfassungen auszuführen. Da die Abfragen `GROUP BY` nicht angeben, verwendet die Abfrage für die Verarbeitung von Datensätzen im Stream gleitende Fenster. 



## Beispiel 1: Verarbeiten eines Streams mit einem gleitenden 1-Minuten-Fenster
<a name="sliding-ex1"></a>

Betrachten Sie den Demo-Stream in der Einführungsübung, der den In-Application-Stream `SOURCE_SQL_STREAM_001` auffüllt. Im Folgenden wird das Schema gezeigt.

```
(TICKER_SYMBOL VARCHAR(4), 
 SECTOR varchar(16),
 CHANGE REAL,
 PRICE REAL)
```

Angenommen, Ihre Anwendung soll Zusammenfassungen mithilfe eines gleitenden 1-Minuten-Fensters verarbeiten. Das bedeutet, dass Ihre Anwendung für jeden neuen, im Stream angezeigten Datensatz eine Ausgabe ausgeben soll, indem Datensätze im vorhergehenden 1-Minuten-Fenster zusammengefasst werden.

Sie können die folgende Abfrage mit Fenster auf Zeitbasis verwenden. Die Abfrage verwendet die `WINDOW`-Klausel, um das 1-Minuten-Bereichsintervall zu definieren. Die Angabe `PARTITION BY` in der `WINDOW`-Klausel gruppiert Datensätze nach Tickerwerten innerhalb des gleitenden Fensters. 

```
SELECT STREAM ticker_symbol,
              MIN(Price) OVER W1 AS Min_Price,
              MAX(Price) OVER W1 AS Max_Price,
              AVG(Price) OVER W1 AS Avg_Price
FROM   "SOURCE_SQL_STREAM_001"
WINDOW W1 AS (
   PARTITION BY ticker_symbol 
   RANGE INTERVAL '1' MINUTE PRECEDING);
```

**So testen Sie die Abfrage**

1. Richten Sie anhand der [Erste Schritte](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)-Übung eine Anwendung ein.

1. Ersetzen Sie die `SELECT`-Anweisung im Anwendungscode durch die vorherige `SELECT`-Abfrage. Der resultierende Anwendungscode wird im Folgenden gezeigt.

   ```
   CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
                            ticker_symbol VARCHAR(10), 
                            Min_Price     double, 
                            Max_Price     double, 
                            Avg_Price     double);
   CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
      INSERT INTO "DESTINATION_SQL_STREAM"
        SELECT STREAM ticker_symbol,
                      MIN(Price) OVER W1 AS Min_Price,
                      MAX(Price) OVER W1 AS Max_Price,
                      AVG(Price) OVER W1 AS Avg_Price
        FROM   "SOURCE_SQL_STREAM_001"
        WINDOW W1 AS (
           PARTITION BY ticker_symbol 
           RANGE INTERVAL '1' MINUTE PRECEDING);
   ```

## Beispiel 2: Abfrage, die Zusammenfassungen auf ein gleitendes Fenster anwendet
<a name="sliding-ex2"></a>

Die folgende Abfrage für den Demo-Stream gibt die durchschnittliche prozentuale Änderung in Bezug auf den Preis der einzelnen Ticker in einem 10-Sekunden-Fenster zurück.

```
SELECT STREAM Ticker_Symbol,
              AVG(Change / (Price - Change)) over W1 as Avg_Percent_Change
FROM "SOURCE_SQL_STREAM_001"
WINDOW W1 AS (
        PARTITION BY ticker_symbol 
        RANGE INTERVAL '10' SECOND PRECEDING);
```



**So testen Sie die Abfrage**

1. Richten Sie anhand der [Erste Schritte](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)-Übung eine Anwendung ein.

1. Ersetzen Sie die `SELECT`-Anweisung im Anwendungscode durch die vorherige `SELECT`-Abfrage. Der resultierende Anwendungscode wird im Folgenden gezeigt.

   ```
   CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
                               ticker_symbol VARCHAR(10), 
                               Avg_Percent_Change double);
   CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
      INSERT INTO "DESTINATION_SQL_STREAM"
         SELECT STREAM Ticker_Symbol,
                       AVG(Change / (Price - Change)) over W1 as Avg_Percent_Change
         FROM "SOURCE_SQL_STREAM_001"
         WINDOW W1 AS (
                 PARTITION BY ticker_symbol 
                 RANGE INTERVAL '10' SECOND PRECEDING);
   ```

## Beispiel 3: Abfragen von Daten aus mehreren gleitenden Fenstern für denselben Stream
<a name="sliding-ex3"></a>

Sie können Abfragen schreiben, um Ausgaben auszugeben, in denen jeder Spaltenwert mittels unterschiedlicher gleitender Fenster berechnet wird, die für denselben Stream definiert sind. 

Im folgenden Beispiel gibt die Abfrage den Ausgabe Ticker, den Preis, a2 und a10 aus. Sie gibt eine Ausgabe für Ticker-Symbole aus, deren gleitender Zwei-Zeilen-Durchschnitt den gleitenden Zehn-Zeilen-Durchschnitt überschreitet. Die Spaltenwerte `a2` und `a10` werden aus Fenstern abgeleitet, die über zwei Zeilen und zehn Zeilen gleiten.

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
                           ticker_symbol      VARCHAR(12), 
                           price              double, 
                           average_last2rows  double, 
                           average_last10rows double);

CREATE OR REPLACE PUMP "myPump" AS INSERT INTO "DESTINATION_SQL_STREAM"
SELECT STREAM ticker_symbol, 
              price, 
              avg(price) over last2rows, 
              avg(price) over last10rows
FROM SOURCE_SQL_STREAM_001
WINDOW
    last2rows AS (PARTITION BY ticker_symbol ROWS 2 PRECEDING),
    last10rows AS (PARTITION BY ticker_symbol ROWS 10 PRECEDING);
```

Um diese Abfrage anhand des Demo-Streams zu testen, befolgen Sie das in [Beispiel 1](#sliding-ex1) beschriebene Testverfahren.

# Operationen für Streaming-Daten: Zusammenführen von Streams
<a name="stream-joins-concepts"></a>

In Ihrer Anwendung kann es mehrere In-Application-Streams geben. Sie können `JOIN`-Abfragen schreiben, um Daten zu korrelieren, die über diese Streams eintreffen. Angenommen, es liegen die folgenden In-Application-Streams vor:
+ **OrderStream**— Empfängt aufgegebene Lagerbestellungen.

  ```
  (orderId SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)
  ```
+ **TradeStream**— Erhält die daraus resultierenden Aktiengeschäfte für diese Bestellungen.

  ```
  (tradeId SqlType, orderId SqlType, ticker SqlType, amount SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)
  ```

Im Folgenden finden Sie Beispiele für `JOIN`-Abfragen, die Daten aus diesen Streams korrelieren.

## Beispiel 1: Bericht zu Bestellungen, bei denen es innerhalb einer Minute nach Platzierung der Bestellung eine Handelsaktion gibt
<a name="join-ex1"></a>

In diesem Beispiel führt die Abfrage `OrderStream` und `TradeStream` zusammen. Da jedoch nur Handelsaktionen ausgegeben werden sollen, die innerhalb einer Minute nach der Bestellung ausgeführt werden, definiert die Abfrage das 1-Minuten-Fenster für den `TradeStream`. Informationen zu Abfragen mit Fenstern finden Sie unter [Gleitende Fenster](sliding-window-concepts.md).

```
SELECT STREAM
     ROWTIME, 
     o.orderId, o.ticker, o.amount AS orderAmount,
     t.amount AS tradeAmount
FROM OrderStream AS o
JOIN TradeStream OVER (RANGE INTERVAL '1' MINUTE PRECEDING) AS t
ON   o.orderId = t.orderId;
```

Sie können die Fenster mittels der `WINDOW`-Klausel explizit definieren und die vorhergehende Abfrage wie folgt schreiben: 

```
SELECT STREAM
    ROWTIME, 
    o.orderId, o.ticker, o.amount AS orderAmount,
    t.amount AS tradeAmount
FROM OrderStream AS o
JOIN TradeStream OVER t
ON o.orderId = t.orderId
WINDOW t AS
    (RANGE INTERVAL '1' MINUTE PRECEDING)
```

Wenn Sie diese Abfrage in Ihren Anwendungscode einschließen, wird der Anwendungscode kontinuierlich ausgeführt. Für jeden im `OrderStream` eintreffenden Datensatz gibt die Anwendung eine Ausgabe aus, wenn es innerhalb des 1-Minuten-Fensters nach Platzierung der Bestellung eine Handelsaktion gibt. 

Die Zusammenführung in der vorhergehenden Abfrage ist eine interne Zusammenführung, bei der die Abfrage Datensätze im `OrderStream` ausgibt, für die es einen übereinstimmenden Datensatz in `TradeStream` gibt (und umgekehrt). Mithilfe einer externen Zusammenführung können Sie ein weiteres interessantes Szenario erstellen. Stellen Sie sich folgendes Szenario vor: Es sollen Börsenaufträge erteilt werden, für die es innerhalb einer Minute nach Platzierung des Auftrags keine Handelsaktionen gibt. Ebenso gibt es Handelsaktionen innerhalb desselben Fensters, die jedoch für andere Börsenaufträge gelten. In diesem Beispiel wird eine *externe Zusammenführung* gezeigt. 

```
SELECT STREAM
    ROWTIME, 
    o.orderId, o.ticker, o.amount AS orderAmount,
    t.ticker, t.tradeId, t.amount AS tradeAmount,
FROM OrderStream AS o
LEFT OUTER JOIN TradeStream OVER (RANGE INTERVAL '1' MINUTE PRECEDING) AS t
ON    o.orderId = t.orderId;
```