ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Event Processing CQL言語リファレンス
11gリリース1 (11.1.1.7)
B61613-06
  目次へ移動
目次

前
 
次
 

9 組込みの集計関数

この章では、Oracle Continuous Query Language (Oracle CQL)に含まれる組込みの集計関数のリファレンスを提供します。組込みの集計関数は、問合せが返すすべての値の集計操作を行います。

詳細は、1.1.11項「関数」を参照してください。

この章の内容は次のとおりです。

9.1 Oracle CQLの組込みの集計関数の概要

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

表9-1 Oracle CQLの組込みの集計関数

関数

集計


集計(増分計算)


拡張集計



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

Oracle Event Processing は、ネストされた集計はサポートしていません。


注意:

組込み関数名では大文字と小文字が区別されるため、表示されている方(小文字)を使用してください。



注意:

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


詳細は、次を参照してください。

9.1.1 組込み集計関数とWhere、Group ByおよびHaving句

Oracle CQLでは、where句はgroup by句およびhaving句の前に適用されます。したがって、例9-1のOracle CQL文は無効です。

例9-1 countの無効な使用

<query id="q1"><![CDATA[ 
    select * from InputChanel[rows 4 slide 4] as ic where count(*) = 4
]]></query>

例9-2に示すようなOracle CQL文を使用する必要があります。

例9-2 countの有効な使用

<query id="q1"><![CDATA[ 
    select * from InputChanel[rows 4 slide 4] as ic, count(*) as myCount having myCount = 4
]]></query>

詳細は、次を参照してください。


avg

構文

avg.pngについては周囲のテキストで説明しています。

目的

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

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

例9-3の問合せfloat_avg例9-4のデータ・ストリームS3があるとします。ストリームS3のスキーマは(c1 float)です。この問合せは、例9-5に示すリレーションを返します。平均値が数字でない場合、avg関数はNaNの結果を返します。詳細は、2.3.2項「数値リテラル」を参照してください。

例9-3 avg関数の問合せ

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

例9-4 avg関数のストリーム入力

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

例9-5 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.pngについては周囲のテキストで説明しています。

(arith_expr::=attr::=identifier::=)

目的

countは、問合せが返すタプル数をintの値として返します。

表9-2に示すように、戻り値は引数によって異なります。

表9-2 COUNT集計関数の戻り値

入力引数 戻り値

arith_expr

arith_exprがnullでない場合のタプルの数。

*


重複とnullを含む、すべてのタプルの数。

identifier.*

相関変数identifierと一致する、重複とnullを含む、すべてのタプルの数。

identifier.attr

attrがnullでない場合に、相関変数identifierと一致するタプルの数。


countは、nullを返しません。

例9-6の問合せq2例9-7のデータ・ストリームS2があるとします。ストリームS2のスキーマは(c1 integer, c2 integer)です。例9-8は、問合せで返されるリレーションを示します。

例9-6 count関数の問合せ

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

例9-7 count関数のストリーム入力

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

例9-8 count関数のリレーション出力

Timestamp                Tuple Kind  Tuple
-9223372036854775808:    +           0,0
1000:                    -           0,0
1000:                    +           1,1
2000:                    -           1,1
2000:                    +           1,2
3000:                    -           1,2
3000:                    +           2,3
6000:                    -           2,3

詳細は、次を参照してください。


first

構文

first.pngについては周囲のテキストで説明しています。

目的

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

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

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

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

例9-9の問合せq9例9-10のデータ・ストリームS0があるとします。ストリームS0のスキーマは(c1 integer, c2 float)です。この例では、パターンCC.c1 = 7と定義します。また、firstcfirst(C.c2)と定義します。つまり、最初にc1 = 7になった場合に、firstcは値c2と等しくなります。この問合せは、例9-11に示すリレーションを返します。

例9-9 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>

例9-10 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

例9-11 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.pngについては周囲のテキストで説明しています。

目的

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

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

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

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

例9-12の問合せq9例9-13のデータ・ストリームS0があるとします。ストリームS1のスキーマは(c1 integer, c2 float)です。この例では、パターンCC.c1 = 7と定義します。また、lastclast(C.c2)と定義します。つまり、最後にc1 = 7になった場合に、lastcは値c2と等しくなります。この問合せは、例9-14に示すリレーションを返します。

例9-12 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>

例9-13 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

例9-14 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

listagg

構文

listagg.pngについては周囲のテキストで説明しています。

目的

listaggは、その関数の引数に相当するJavaの値を含むjava.util.Listを返します。

関数の引数としてユーザー定義のクラスが使用される場合、そのクラスはequalsメソッドを実装する必要があります。

例9-15「listaggの問合せ」では、ビューv1で例9-16「listaggの例の入力」の第3列の値をjava.util.List (デフォルトの戻り型)およびjava.util.LinkedHashSetに集計します。問合せq1では、例9-17「listaggリレーションの出力」での出力を生成するために、それぞれのサイズを選択します。

例9-15 listaggの問合せ

<view id="v1"><![CDATA[
    ISTREAM(select c1, listAgg(c3) as l1, 
        java.util.LinkedHashSet(listAgg(c3)) as set1 
    from S1 
    group by c1)
]]></view>

<query id="q1"><![CDATA[
    select v1.l1.size(), v1.set1.size() 
    from v1
]]></query> 

例9-16 listaggの例の入力

Timestamp     Tuple
1000          rcl, 1, 15, 400
1000          msft, 1, 15, 400
2000          orcl, 2, 20, 300
2000          msft, 2, 20, 300
5000          orcl, 4, 5, 200
5000          msft, 4, 5, 200
7000          orcl, 3, 10, 100
7000          msft, 3, 20, 100
h 20000000

例9-17 listaggのリレーション出力

Timestamp   Tuple Kind   Tuple
 1000:          +        1,1
 1000:          +        1,1
 2000:          +        2,2
 2000:          +        2,2
 5000:          +        3,3
 5000:          +        3,3
 7000:          +        4,4
 7000:          +        4,3

max

構文

max.pngについては周囲のテキストで説明しています。

目的

maxは、exprの最大値を返します。そのデータ型は引数のデータ型によって異なります。

例9-18の問合せtest_max_timestamp例9-19のデータ・ストリームS15があるとします。ストリームS15のスキーマは(c1 int, c2 timestamp)です。この問合せは、例9-20に示すリレーションを返します。

例9-18 max関数の問合せ

<query id="test_max_timestamp"><![CDATA[ 
    select max(c2) from S15[range 2]
]]></query>

例9-19 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

例9-20 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.pngについては周囲のテキストで説明しています。

目的

minは、exprの最小値を返します。そのデータ型は引数のデータ型によって異なります。

例9-21の問合せtest_min_timestamp例9-22のデータ・ストリームS15があるとします。ストリームS15のスキーマは(c1 int, c2 timestamp)です。この問合せは、例9-23に示すリレーションを返します。

例9-21 min関数の問合せ

<query id="test_min_timestamp"><![CDATA[ 
    select min(c2) from S15[range 2]
]]></query>

例9-22 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

例9-23 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.pngについては周囲のテキストで説明しています。

目的

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

例9-24の問合せq3例9-25のデータ・ストリームS1があるとします。ストリームS1のスキーマは(c1 integer, c2 bigint)です。この問合せは、例9-26に示すリレーションを返します。rangeの詳細は、「範囲ベースのストリームからリレーションへのウィンドウ演算子」を参照してください。

例9-24 sumの問合せ

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

例9-25 sumのストリーム入力

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

例9-26 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.pngについては周囲のテキストで説明しています。

目的

xmlaggは、集計されたXMLドキュメントとしてXMLフラグメントの集合を返します。nullを返す引数は結果から削除されます。

ORDER BY句を使用すると、フラグメントの順序を制御できます。詳細は、20.2.9項「問合せ結果のソート」を参照してください。

この項では、次のxmlaggの例を示します。

xmlagg関数とxmlelement関数

例9-27の問合せtkdata67_q1例9-28の入力リレーションがあるとします。ストリームtkdata67_S0のスキーマは(c1 integer, c2 float)です。この問合せでは、xmlelementを使用してストリーム要素からXMLフラグメントを作成し、xmlaggを使用してそれらのXMLフラグメントをXMLドキュメントに集計します。この問合せは、例9-29に示すリレーションを返します。

xmlelementの詳細は、xmlelement_exprを参照してください。

例9-27 xmlaggの問合せ

<query id="tkdata67_q1"><![CDATA[ 
    select 
        c1, 
        xmlagg(xmlelement("c2",c2)) 
    from 
        tkdata67_S0[rows 10] 
    group by c1
]]></query>

例9-28 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

例9-29 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句

例9-30の問合せtkxmlAgg_q5例9-31の入力リレーションがあるとします。ストリームtkxmlAgg_S1のスキーマは(c1 int, c2 xmltype)です。この問合せでは、xmltypeストリーム要素を選択し、XMLAGGを使用してそれらをXMLドキュメントに集計します。また、ORDER BY句を使用してXMLフラグメントを並べ替えます。この問合せは、例9-32に示すリレーションを返します。

例9-30 xmlaggとORDER BYの問合せ

<query id="tkxmlAgg_q5"><![CDATA[ 
    select 
        xmlagg(c2), 
        xmlagg(c2 order by c1) 
    from 
        tkxmlAgg_S1[range 2]
]]></query>

例9-31 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>"

例9-32 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>