目的の処理の実行が,一つのクエリでは実現できないことがあります。この場合,一つ目(前段)のクエリの処理結果を二つ目(後段)のクエリの処理対象とします。これをクエリの連結といいます。クエリの連結には,次の2種類があります。
クエリを連結する場合に,前段のクエリと後段のクエリで処理対象のデータが異なることがあります。例えば,前段のクエリで1分間のデータを分析対象にし,後段のクエリで1時間分のデータを分析対象にするときは,ストリームデータによるクエリの連結が適しています。一方,前段のクエリと後段のクエリで,分析対象のデータが同じ場合は,リレーションによるクエリの連結が適しています。
以降で,それぞれのクエリの連結について説明します。
ストリームデータによるクエリの連結について,観測所ごとの1分間の平均気温を計算し,過去1日の最高平均気温を出力する場合を例に説明します。このクエリを実行した場合の,入力データと出力データを次の図に示します。
図2-21 ストリームデータによるクエリの連結を実行した場合の入力データと出力データ
前段のクエリ(クエリ1)では観測所ごとの1分間の平均気温を計算し,後段のクエリ(クエリ2)では過去1日の最高平均気温を計算します。
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] );
リレーションによるクエリの連結について,観測所ごとの平均気温を計算し,現時点で最も高い平均気温(最高平均気温)を出力する場合を例に説明します。このクエリを実行した場合の,入力データと出力データを次の図に示します。
図2-22 リレーションによるクエリの連結を実行した場合の入力データと出力データ
この図に示すとおり,前段のクエリ(クエリ1)では観測所ごとの1分間の平均気温を計算し,後段のクエリ(クエリ2)では最高平均気温を計算します。
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);