ヘッダーをスキップ
Oracle® CEP CQL 言語リファレンス
11g リリース 1 (11.1.1)
B55504-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

6 関数 : 集約

集約関数は、クエリが返すすべての値をまとめます。

詳細については、節 1.1.9「関数」を参照してください。

6.1 Oracle CQL の組み込みの集約関数の概要

表 6-1 は、Oracle CQL に用意されている組み込みの集約関数を示しています。

表 6-1 Oracle CQL の組み込みの集約関数

関数

集約


集約 (増分計算)


拡張集約



builtin_aggr::=

builtin_aggr.gif を説明する関連テキスト

builtin_aggr_incr::=

builtin_aggr_incr.gif を説明する関連テキスト

extended_builtin_aggr::=

extended_builtin_aggr.gif を説明する関連テキスト

選択された重複するタプルの各セットのコピーを 1 つだけ Oracle CEP が返すようにする場合は、distinct を指定します。重複タプルとは select リスト内の各式と一致する値を持つタプルです。詳細については、aggr_distinct_expr を参照してください。

Oracle CEP ではネストされた集約をサポートしていません。


注意 :

ストリーム入力の例で、h で始まる行 (h 3800 など) はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことを Oracle CEP に通知します。

詳細については、以下を参照してください。


AVG

構文

avg.gif を説明する関連テキスト

目的

AVG は、expr の平均値を返します。

この関数は、bigintfloat、または int データ型を引数として使用します。また、引数の数値データ型に関係なく float を返します。

例 6-1 のクエリ float_avg例 6-2 のデータ ストリーム S3 があるとします。ストリーム S3 にはスキーマ (c1 float) があります。このクエリは、例 6-3 に示すリレーションを返します。平均値が数字でない場合、AVG 関数は NaN の結果を返します。詳細については、節 2.4.2「数値リテラル」を参照してください。

例 6-1 AVG 関数のクエリ

<query id="float_avg"><![CDATA[ 
    select avg(c1) from S3[range 5]
]]></query>

例 6-2 AVG 関数のストリーム入力

Timestamp   Tuple
 1000 
 2000        5.5
 8000        4.4
 9000
15000       44.2
h 200000000

例 6-3 AVG 関数のリレーション出力

Timestamp   Tuple Kind  Tuple
    0:      + 
 1000:      - 
 1000:      +            0.0
 2000:      -            0.0
 2000:      +            5.5
 6000:      -            5.5
 6000:      +            5.5
 7000:      -            5.5
 7000:      +
 8000:      -
 8000:      +            4.4
 9000:      -            4.4
 9000:      +            4.4
13000:      -            4.4
13000:      +           NaN
14000:      -           NaN
14000:      +
15000:      -
15000:      +           44.2
20000:      -           44.2
20000:      + 

COUNT

構文

count.gif を説明する関連テキスト

目的

COUNT は、クエリが返すタプル数を int の値として返します。

expr を指定すると、COUNTexpr が null でないタプルの数を返します。

アスタリスク (*) を指定すると、この関数は、重複するタプルと null のタプルを含むすべてのタプルの数を返します。COUNT が null を返すことはありません。

例 6-4 のクエリ q2例 6-5 のデータ ストリーム S2 があるとします。ストリーム S2 のスキーマは (c1 integer, c2 integer) です。このクエリは、例 6-6 に示すリレーションを返します。range ウィンドウの詳細については、「範囲ベースのストリームからリレーションへの枠演算子」を参照してください。

例 6-4 COUNT 関数のクエリ

<query id="q2"><![CDATA[ 
    SELECT COUNT(c2), COUNT(*) FROM  S [RANGE 10]
]]></query>

例 6-5 COUNT 関数のストリーム入力

Timestamp   Tuple
1000        1,2
2000        1,
3000        1,4
6000        1,6

例 6-6 COUNT 関数のリレーション出力

Timestamp   Tuple Kind  Tuple
0:          +           0,0
1000:       -           0,0
1000:       +           1,1
2000:       +           1,1
2000:       +           2,2
3000:       +           2,2
3000:       +           3,3
5000:       +           3,3
5000:       +           3,4
6000:       +           3,4
6000:       +           4,5
7000:       -           4,5
7000:       +           5,6
8000:       +           5,6

FIRST

構文

first.gif を説明する関連テキスト

目的

FIRST は、指定されたパターンに最初に一致する、指定されたストリーム要素の値を返します。

指定されるストリーム要素の型は、次のいずれかになります。

この関数の戻り値の型は、指定されたストリーム要素の型によって異なります。

この関数は、ピリオドで区切られた次の値で構成される 1 つの引数を使用します。

例 6-7 のクエリ q9例 6-8 のデータ ストリーム S0 があるとします。ストリーム S0 にはスキーマ (c1 integer, c2 float) があります。この例では、パターン CC.c1 = 7 と定義します。また、firstcfirst(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>

例 6-8 FIRST 関数のストリーム入力

Timestamp   Tuple
 1000       33,0.9
 3000       44,0.4
 4000       30,0.3
 5000       10,10.0
 6000        7,0.9
 7000        7,2.3
 9000        7,8.7
11000       40,6.6
15000       19,8.8
17000       30,5.5
20000        5,10.0
23000       40,6.6
25000        3,5.5
30000       30,2.2
35000        2,10.0
40000        7,5.5
44000       40,8.9

例 6-9 FIRST 関数のリレーション出力

Timestamp   Tuple Kind  Tuple
11000:      +           0.9,8.7,30,10,7.0,40
23000:      +           ,,30,5,,40
44000:      +           5.5,5.5,30,2,7.0,40

LAST

構文

last.gif を説明する関連テキスト

目的

LAST は、指定されたパターンに最後に一致する、指定されたストリーム要素の値を返します。

指定されるストリーム要素の型は、次のいずれかになります。

この関数の戻り値の型は、指定されたストリーム要素の型によって異なります。

この関数は、ピリオドで区切られた次の値で構成される 1 つの引数を使用します。

例 6-10 のクエリ q9例 6-11 のデータ ストリーム S0 があるとします。ストリーム S1 にはスキーマ (c1 integer, c2 float) があります。この例では、パターン CC.c1 = 7 と定義します。また、lastclast(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>

例 6-11 LAST 関数のストリーム入力

Timestamp   Tuple
 1000       33,0.9
 3000       44,0.4
 4000       30,0.3
 5000       10,10.0
 6000        7,0.9
 7000        7,2.3
 9000        7,8.7
11000       40,6.6
15000       19,8.8
17000       30,5.5
20000        5,10.0
23000       40,6.6
25000        3,5.5
30000       30,2.2
35000        2,10.0
40000        7,5.5
44000       40,8.9

例 6-12 LAST 関数のリレーション出力

Timestamp   Tuple Kind  Tuple
11000:      +           0.9,8.7,30,10,7.0,40
23000:      +           ,,30,5,,40
44000:      +           5.5,5.5,30,2,7.0,40

MAX

構文

max.gif を説明する関連テキスト

目的

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

構文

min.gif を説明する関連テキスト

目的

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

構文

sum.gif を説明する関連テキスト

目的

SUM は、expr の値の合計を返します。この関数は、bigintfloat、または integer 式を引数として使用します。また、引数の数値データ型と同じデータ型を返します。

例 6-19 のクエリ q3例 6-20 のデータ ストリーム S1 があるとします。ストリーム S1 にはスキーマ (c1 integer, c2 bigint) があります。このクエリは、例 6-21 に示すリレーションを返します。rangeの詳細については、「範囲ベースのストリームからリレーションへの枠演算子」を参照してください。

例 6-19 SUM のクエリ

<query id="q3"><![CDATA[ 
    select sum(c2) from S1[range 5]
]]></query>

例 6-20 SUM のストリーム入力

Timestamp   Tuple
1000         5,
1000        10,5
2000          ,4
3000        30,6
5000        45,44
7000        55,3
h 200000000

例 6-21 SUM のリレーション出力

Timestamp   Tuple Kind  Tuple
    0:      +
 1000:      -
 1000:      +           5
 2000:      -           5
 2000:      +           9
 3000:      -           9
 3000:      +           15
 5000:      -           15
 5000:      +           59
 6000:      -           59
 6000:      +           54
 7000:      -           54
 7000:      +           53
 8000:      -           53
 8000:      +           47
10000:      -           47
10000:      +           3
12000:      -           3
12000:      +

XMLAGG

構文

xmlagg.gif を説明する関連テキスト

目的

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>