ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework アプリケーション開発ガイド

[目次][索引][前へ][次へ]

2.6.2 時刻解像度を指定した定義例

ここでは,時刻解像度を指定したクエリの定義例として,次の2種類の例について説明します。

この例では,1分間のRANGEウィンドウ内にある到着タプルに対して,集合関数による関係演算を実行します。この例で扱うストリームは次のとおりです。

時刻解像度の指定例で扱うストリーム
  • ストリーム名は「stock」である。
  • 「price」という名称の列がある。
<この項の構成>
(1) 一つの集合関数を定義する例
(2) 複数の集合関数を定義する例

(1) 一つの集合関数を定義する例

ストリームstockに対して,RANGEウィンドウ内にある到着タプルから列名priceの合計値を求める場合の定義例を次に示します。

 
REGISTER STREAM stock(price INTEGER, name VARCHAR(10));    …(1)
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=stock PERIOD=300MS TARGETS=SUM(price);    …(2)
REGISTER QUERY q1    …(3)
ISTREAM(
  SELECT name, SUM (price) AS s1
  FROM stock[RANGE 1 MINUTE]
  GROUP BY name
);
 
(1)〜(3)は次に示す説明と対応している番号です。実際の定義には不要です。

時刻解像度を指定するクエリの名称は,(3)で指定しているq1です。このため,(2)のQUERY_ATTRIBUTE文でも,クエリ名としてq1を指定します。

この例は,(1)で指定しているストリーム名stockについて,時刻解像度を指定して列名priceの合計値を求める例です。このため,(2)のSTREAM_NAME=のデータ識別子にはstockを指定して,TARGETS=には集合関数SUM(price)を指定します。

合計値ではなく,最大値または最小値を求める場合には,集合関数MAXまたはMINを指定してください。

(2) 複数の集合関数を定義する例

ストリームstockに対して,RANGEウィンドウ内にある到着タプルから列名priceの合計値,最大値および最小値を求める場合の定義例を次に示します。

 
REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY q0
ISTREAM(
  SELECT name, price AS price0, price AS price1, price AS price2
  FROM stock[NOW]
);
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=q0 PERIOD=300MS 
TARGETS=SUM(price0),MAX(price1),MIN(price2);
REGISTER QUERY q1
ISTREAM(
  SELECT q0.name, SUM(q0.price0) AS sum_price,
    MAX(q0.price1) AS max_price, MIN(q0.price2) AS min_price
  FROM q0[RANGE 1 MINUTE]
GROUP BY q0.name
);
 

時刻解像度を指定して複数の集合演算を実行する場合,同じデータ識別子を持つ同一名称の列名に対して,複数の集合演算は実行できません。例えば,データ識別子stockの列名priceのクエリに対して,「TARGETS=SUM(price),MAX(price),MIN(price)」のような指定はできません。

複数の集合関数を指定する場合は,集合関数の対象とする列名をそれぞれ用意する必要があります。この例では,SUM,MAX,MINそれぞれの対象とする列名として,列名priceをprice0,price1,price2という列名に置き換えた上で,それぞれの集合関数による演算を実行しています。