詳細については、節 1.1.9「関数」を参照してください。
表 6-1 は、Oracle CQL に用意されている組み込みの集約関数を示しています。
選択された重複するタプルの各セットのコピーを 1 つだけ Oracle CEP が返すようにする場合は、distinct
を指定します。重複タプルとは select リスト内の各式と一致する値を持つタプルです。詳細については、aggr_distinct_expr を参照してください。
Oracle CEP ではネストされた集約をサポートしていません。
注意 : ストリーム入力の例で、h で始まる行 (h 3800 など) はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことを Oracle CEP に通知します。 |
詳細については、以下を参照してください。
構文
目的
この関数は、bigint
、float
、または int
データ型を引数として使用します。また、引数の数値データ型に関係なく float
を返します。
例
例 6-1 のクエリ float_avg
と 例 6-2 のデータ ストリーム S3
があるとします。ストリーム S3
にはスキーマ (c1 float)
があります。このクエリは、例 6-3 に示すリレーションを返します。平均値が数字でない場合、AVG
関数は NaN
の結果を返します。詳細については、節 2.4.2「数値リテラル」を参照してください。
構文
目的
COUNT
は、クエリが返すタプル数を int
の値として返します。
expr
を指定すると、COUNT
は expr
が null でないタプルの数を返します。
アスタリスク (*
) を指定すると、この関数は、重複するタプルと null のタプルを含むすべてのタプルの数を返します。COUNT
が null を返すことはありません。
例
例 6-4 のクエリ q2
と 例 6-5 のデータ ストリーム S2
があるとします。ストリーム S2
のスキーマは (c1 integer, c2 integer)
です。このクエリは、例 6-6 に示すリレーションを返します。range
ウィンドウの詳細については、「範囲ベースのストリームからリレーションへの枠演算子」を参照してください。
構文
目的
FIRST
は、指定されたパターンに最初に一致する、指定されたストリーム要素の値を返します。
指定されるストリーム要素の型は、次のいずれかになります。
bigint
integer
byte
char
float
interval
timestamp
この関数の戻り値の型は、指定されたストリーム要素の型によって異なります。
この関数は、ピリオドで区切られた次の値で構成される 1 つの引数を使用します。
identifier1
: DEFINE
句で指定されたパターンの名前。
identifier2
: CREATE STREAM
文で指定されたストリーム要素の名前。
例
例 6-7 のクエリ q9
と 例 6-8 のデータ ストリーム S0
があるとします。ストリーム S0
にはスキーマ (c1 integer, c2 float)
があります。この例では、パターン C
を C.c1 = 7
と定義します。また、firstc
を first(C.c2)
と定義します。つまり、初めて c1 = 7
になった場合に、firstc
は値 c2
と等しくなります。このクエリは、例 6-9 に示すリレーションを返します。
例 6-7 FIRST 関数のクエリ
<query id="q9"><![CDATA[ select T.firstc, T.lastc, T.Ac1, T.Bc1, T.avgCc1, T.Dc1 from S0 MATCH_RECOGNIZE ( MEASURES first(C.c2) as firstc, last(C.c2) as lastc, avg(C.c1) as avgCc1, A.c1 as Ac1, B.c1 as Bc1, D.c1 as Dc1 PATTERN(A B C* D) DEFINE A as A.c1 = 30, B as B.c2 = 10.0, C as C.c1 = 7, D as D.c1 = 40 ) as T ]]></query>
構文
目的
LAST
は、指定されたパターンに最後に一致する、指定されたストリーム要素の値を返します。
指定されるストリーム要素の型は、次のいずれかになります。
bigint
integer
byte
char
float
interval
timestamp
この関数の戻り値の型は、指定されたストリーム要素の型によって異なります。
この関数は、ピリオドで区切られた次の値で構成される 1 つの引数を使用します。
identifier1
: DEFINE
句で指定されたパターンの名前。
identifier2
: CREATE STREAM
文で指定されたストリーム要素の名前。
例
例 6-10 のクエリ q9
と 例 6-11 のデータ ストリーム S0
があるとします。ストリーム S1
にはスキーマ (c1 integer, c2 float)
があります。この例では、パターン C
を C.c1 = 7
と定義します。また、lastc
を last(C.c2)
と定義します。つまり、最後に c1 = 7
になった場合に、lastc
は値 c2
と等しくなります。このクエリは、例 6-12 に示すリレーションを返します。
例 6-10 LAST 関数のクエリ
<query id="q9"><![CDATA[ select T.firstc, T.lastc, T.Ac1, T.Bc1, T.avgCc1, T.Dc1 from S0 MATCH_RECOGNIZE ( MEASURES first(C.c2) as firstc, last(C.c2) as lastc, avg(C.c1) as avgCc1, A.c1 as Ac1, B.c1 as Bc1, D.c1 as Dc1 PATTERN(A B C* D) DEFINE A as A.c1 = 30, B as B.c2 = 10.0, C as C.c1 = 7, D as D.c1 = 40 ) as T ]]></query>
構文
目的
MAX
は、expr
の最大値を返します。そのデータ型は引数のデータ型によって異なります。
例
例 6-13 のクエリ test_max_timestamp
と 例 6-14 のデータ ストリーム S15
があるとします。ストリーム S15
にはスキーマ (c1 int, c2 timestamp)
があります。このクエリは、例 6-15 に示すリレーションを返します。
例 6-13 MAX 関数のクエリ
<query id="test_max_timestamp"><![CDATA[ select max(c2) from S15[range 2] ]]></query>
例 6-14 MAX 関数のストリーム入力
Timestamp Tuple 10 1,"08/07/2004 11:13:48" 2000 ,"08/07/2005 11:13:48" 3400 3,"08/07/2006 11:13:48" 4700 ,"08/07/2007 11:13:48" h 8000 h 200000000
例 6-15 MAX 関数のリレーション出力
Timestamp Tuple Kind Tuple 0: + 10: - 10: + 08/07/2004 11:13:48 2000: - 08/07/2004 11:13:48 2000: + 08/07/2005 11:13:48 2010: - 08/07/2005 11:13:48 2010: + 08/07/2005 11:13:48 3400: - 08/07/2005 11:13:48 3400: + 08/07/2006 11:13:48 4000: - 08/07/2006 11:13:48 4000: + 08/07/2006 11:13:48 4700: - 08/07/2006 11:13:48 4700: + 08/07/2007 11:13:48 5400: - 08/07/2007 11:13:48 5400: + 08/07/2007 11:13:48 6700: - 08/07/2007 11:13:48 6700: +
構文
目的
MIN
は、expr
の最小値を返します。そのデータ型は引数のデータ型によって異なります。
例
例 6-16 のクエリ test_min_timestamp
と 例 6-17 のデータ ストリーム S15
があるとします。ストリーム S15
にはスキーマ (c1 int, c2 timestamp)
があります。このクエリは、例 6-18 に示すリレーションを返します。
例 6-16 MIN 関数のクエリ
<query id="test_min_timestamp"><![CDATA[ select min(c2) from S15[range 2] ]]></query>
例 6-17 MIN 関数のストリーム入力
Timestamp Tuple 10 1,"08/07/2004 11:13:48" 2000 ,"08/07/2005 11:13:48" 3400 3,"08/07/2006 11:13:48" 4700 ,"08/07/2007 11:13:48" h 8000 h 200000000
例 6-18 MIN 関数のリレーション出力
Timestamp Tuple Kind Tuple 0: + 10: - 10: + 08/07/2004 11:13:48 2000: - 08/07/2004 11:13:48 2000: + 08/07/2004 11:13:48 2010: - 08/07/2004 11:13:48 2010: + 08/07/2005 11:13:48 3400: - 08/07/2005 11:13:48 3400: + 08/07/2005 11:13:48 4000: - 08/07/2005 11:13:48 4000: + 08/07/2006 11:13:48 4700: - 08/07/2006 11:13:48 4700: + 08/07/2006 11:13:48 5400: - 08/07/2006 11:13:48 5400: + 08/07/2007 11:13:48 6700: - 08/07/2007 11:13:48 6700: +
構文
目的
SUM
は、expr
の値の合計を返します。この関数は、bigint
、float
、または integer
式を引数として使用します。また、引数の数値データ型と同じデータ型を返します。
例
例 6-19 のクエリ q3
と 例 6-20 のデータ ストリーム S1
があるとします。ストリーム S1
にはスキーマ (c1 integer, c2 bigint)
があります。このクエリは、例 6-21 に示すリレーションを返します。range
の詳細については、「範囲ベースのストリームからリレーションへの枠演算子」を参照してください。
構文
目的
XMLAGG
は、集約された XML ドキュメントとして XML フラグメントの集合を返します。null を返す引数は結果から削除されます。
order_by_clause
を使用すると、フラグメントの順序を制御できます。詳細については、節 14.2.6「クエリ結果のソート」を参照してください。
例
この節では、次の XMLAGG
の例を示します。
XMLAGG と XMLELEMENT
例 6-22 のクエリ tkdata67_q1
と 例 6-23 の入力リレーションがあるとします。ストリーム tkdata67_S0
にはスキーマ (c1 integer, c2 float)
があります。このクエリでは、XMLELEMENT
を使用してストリーム要素から XML フラグメントを作成し、XMLAGG
を使用してそれらの XML フラグメントを XML ドキュメントに集約します。このクエリは、例 6-24 に示すリレーションを返します。
XMLELEMENT の詳細については、「xmlelement_expr」を参照してください。
例 6-22 XMLAGG のクエリ
<query id="tkdata67_q1"><![CDATA[ select c1, xmlagg(xmlelement("c2",c2)) from tkdata67_S0[rows 10] group by c1 ]]></query>
例 6-23 XMLAGG のリレーション入力
Timestamp Tuple 1000 15, 0.1 1000 20, 0.14 1000 15, 0.2 4000 20, 0.3 10000 15, 0.04 h 12000
例 6-24 XMLAGG のリレーション出力
Timestamp Tuple Kind Tuple 1000: + 15,<c2>0.1</c2> <c2>0.2</c2> 1000: + 20,<c2>0.14</c2> 4000: - 20,<c2>0.14</c2> 4000: + 20,<c2>0.14</c2> <c2>0.3</c2> 10000: - 15,<c2>0.1</c2> <c2>0.2</c2> 10000: + 15,<c2>0.1</c2> <c2>0.2</c2> <c2>0.04</c2>
XMLAGG と ORDER BY
例 6-25 のクエリ tkxmlAgg_q5
と 例 6-26 の入力リレーションがあるとします。ストリーム tkxmlAgg_S1
にはスキーマ (c1 int, c2 xmltype)
があります。このクエリでは、xmltype
ストリーム要素を選択し、XMLAGG を使用してそれらを XML ドキュメントに集約します。また、ORDER BY
句を使用して XML フラグメントを並べ替えます。このクエリは、例 6-27 に示すリレーションを返します。
例 6-25 XMLAGG と ORDER BY のクエリ
<query id="tkxmlAgg_q5"><![CDATA[ select xmlagg(c2), xmlagg(c2 order by c1) from tkxmlAgg_S1[range 2] ]]></query>
例 6-26 XMLAGG と ORDER BY のリレーション入力
Timestamp Tuple 1000 1, "<a>hello</a>" 2000 10, "<b>hello1</b>" 3000 15, "<PDRecord><PDName>hello</PDName></PDRecord>" 4000 5, "<PDRecord><PDName>hello</PDName><PDName>hello1</PDName></PDRecord>" 5000 51, "<PDRecord><PDId>6</PDId><PDName>hello1</PDName></PDRecord>" 6000 15, "<PDRecord><PDId>46</PDId><PDName>hello2</PDName></PDRecord>" 7000 55, "<PDRecord><PDId>6</PDId><PDName>hello2</PDName><PDName>hello3</PDName></PDRecord>"
例 6-27 XMLAGG と ORDER BY のリレーション出力
Timestamp Tuple Kind Tuple 0: + 1000: - 1000: + <a>hello</a> ,<a>hello</a> 2000: - <a>hello</a> ,<a>hello</a> 2000: + <a>hello</a> <b>hello1</b> ,<a>hello</a> <b>hello1</b> 3000: - <a>hello</a> <b>hello1</b> ,<a>hello</a> <b>hello1</b> 3000: + <b>hello1</b> <PDRecord> <PDName>hello</PDName> </PDRecord> ,<b>hello1</b> <PDRecord> <PDName>hello</PDName> </PDRecord> 4000: - <b>hello1</b> <PDRecord> <PDName>hello</PDName> </PDRecord> ,<b>hello1</b> <PDRecord> <PDName>hello</PDName> </PDRecord> 4000: + <PDRecord> <PDName>hello</PDName> </PDRecord> <PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> ,<PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDName>hello</PDName> </PDRecord> 5000: - <PDRecord> <PDName>hello</PDName> </PDRecord> <PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> ,<PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDName>hello</PDName> </PDRecord> 5000: + <PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> ,<PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> 6000: - <PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> ,<PDRecord> <PDName>hello</PDName> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> 6000: + <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDId>46</PDId> <PDName>hello2</PDName> </PDRecord> ,<PDRecord> <PDId>46</PDId> <PDName>hello2</PDName> </PDRecord> <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> 7000: - <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord> <PDRecord> <PDId>46</PDId> <PDName>hello2</PDName> </PDRecord> ,<PDRecord> <PDId>46</PDId> <PDName>hello2</PDName> </PDRecord> <PDRecord> <PDId>6</PDId> <PDName>hello1</PDName> </PDRecord>