2.3.7 クエリの連結

目的の処理の実行が,一つのクエリでは実現できないことがあります。この場合,一つ目(前段)のクエリの処理結果を二つ目(後段)のクエリの処理対象とします。これをクエリの連結といいます。クエリの連結には,次の2種類があります。

クエリを連結する場合に,前段のクエリと後段のクエリで処理対象のデータが異なることがあります。例えば,前段のクエリで1分間のデータを分析対象にし,後段のクエリで1時間分のデータを分析対象にするときは,ストリームデータによるクエリの連結が適しています。一方,前段のクエリと後段のクエリで,分析対象のデータが同じ場合は,リレーションによるクエリの連結が適しています。

以降で,それぞれのクエリの連結について説明します。

<この項の構成>
(1) ストリームデータによるクエリの連結
(2) リレーションによるクエリの連結

(1) ストリームデータによるクエリの連結

ストリームデータによるクエリの連結について,観測所ごとの1分間の平均気温を計算し,過去1日の最高平均気温を出力する場合を例に説明します。このクエリを実行した場合の,入力データと出力データを次の図に示します。

図2-21 ストリームデータによるクエリの連結を実行した場合の入力データと出力データ

[図データ]

前段のクエリ(クエリ1)では観測所ごとの1分間の平均気温を計算し,後段のクエリ(クエリ2)では過去1日の最高平均気温を計算します。

クエリの内容
クエリを連結する場合,後段のクエリのFROM句に,前段のクエリの名称を指定します。

REGISTER STREAM temperature_stream
(observation_time TIME, id INTEGER, temperature INTEGER);
REGISTER QUERY average_calculation
ISTREAM (
SELECT id, AVG(temperature) AS average_temperature
FROM temperature_stream[RANGE 1 MINUTE]
GROUP BY id);
REGISTER QUERY MAX_temperature
ISTREAM (
SELECT MAX(average_temperature)
FROM average_calculation[RANGE 1 DAY] );

クエリの解説
前段のクエリ(average_calculation)は,「2.3.5 データの分類と集計」で説明したクエリと同じです。一方,後段のクエリ(MAX_temperature)は,前段のクエリが出力したストリームデータを入力とし,ウィンドウ演算で分析対象のタプルを抽出します。後段のクエリの分析対象は,過去1日のタプルです。そのため,後段のクエリのFROM句には,「[RANGE 1 DAY]」を指定しています。

(2) リレーションによるクエリの連結

リレーションによるクエリの連結について,観測所ごとの平均気温を計算し,現時点で最も高い平均気温(最高平均気温)を出力する場合を例に説明します。このクエリを実行した場合の,入力データと出力データを次の図に示します。

図2-22 リレーションによるクエリの連結を実行した場合の入力データと出力データ

[図データ]

この図に示すとおり,前段のクエリ(クエリ1)では観測所ごとの1分間の平均気温を計算し,後段のクエリ(クエリ2)では最高平均気温を計算します。

クエリの内容
リレーションによるクエリの連結では,前段のクエリでのストリーム化演算,および後段のクエリでのウィンドウ演算を使用しません。後段のクエリのFROM句には,前段のクエリの名称を指定します。
なお,ストリーム句を使用しない場合,SELECT句以降を半角丸括弧(( ))で囲む必要はありません。

REGISTER STREAM temperature_stream
(observation_time TIME, id INTEGER, temperature INTEGER);
REGISTER QUERY average_calculation
SELECT id, AVG(temperature) AS average_temperature
FROM temperature_stream[RANGE 1 MINUTE]
GROUP BY id;
REGISTER QUERY MAX_temperature
ISTREAM (
SELECT MAX(average_temperature) AS MAX_temperature
FROM average_calculation);

クエリの解説
リレーションによるクエリの連結では,前段のクエリ(average_calculation)の出力リレーション(観測所ごとの平均気温)と,後段のクエリ(MAX_temperature)の入力リレーション(観測所ごとの平均気温)は同じ内容です。