プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス
12c リリース(12.1.3)
E57533-04
目次へ移動
目次

前
前へ
次
次へ

9 組込みの集計関数

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

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

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

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

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

関数

集計

集計(増分計算)

拡張集計

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

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

注意:

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

注意:

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

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

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

Oracle CQLでは、where句はgroup by句およびhaving句の前に適用されます。つまり、次のOracle CQL文は無効です。

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

かわりに、次のOracle CQL文を使用する必要があります。

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

9.2 avg

構文

avg

目的

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

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

入出力の型

次の表に、入力の型および対応する出力の型を示します。

問合せfloat_avgとデータ・ストリームS3があるとします。ストリームS3のスキーマは(c1 float)です。この問合せはリレーションを返します。平均値が数字でない場合、avg関数はNaNの結果を返します。

<query id="float_avg"><![CDATA[ 
    select avg(c1) from S3[range 5]
]]></query>
Timestamp   Tuple
 1000 
 2000        5.5
 8000        4.4
 9000
15000       44.2
h 200000000
Timestamp   Tuple Kind  Tuple
 1000:      - 
 1000:      +            0.0
 2000:      -            0.0
 2000:      +            5.5
 6000:      -            5.5
 6000:      +            5.5
 7000:      -            5.5
 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:      + 

9.3 count

構文

count

目的

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

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

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

入力引数 戻り値

arith_expr

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

*

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

identifier.*

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

identifier.attr

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

countは、nullを返しません。

問合せq2とデータ・ストリームS2があるとします。ストリームS2のスキーマは(c1 integer, c2 integer)です。この問合せはリレーションを返します。

<query id="q2"><![CDATA[ 
    SELECT COUNT(c2), COUNT(*) FROM  S2 [RANGE 10]
]]></query>
Timestamp   Tuple
1000        1,2
2000        1,
3000        1,4
6000        1,6
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
6000:                    +           3,4

9.4 first

構文

first

目的

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

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

  • bigint

  • integer

  • byte

  • char

  • float

  • interval

  • timestamp

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

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

  • identifier1: DEFINE句で指定されたパターンの名前。

  • identifier2: CREATE STREAM文で指定されたストリーム要素の名前。

関連項目:

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

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

9.5 last

構文

last

目的

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

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

  • bigint

  • integer

  • byte

  • char

  • float

  • interval

  • timestamp

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

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

  • identifier1: DEFINE句で指定されたパターンの名前。

  • identifier2: CREATE STREAM文で指定されたストリーム要素の名前。

関連項目:

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

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

9.6 listagg

構文

list agg

目的

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

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

<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> 
Timestamp     Tuple
1000          orcl, 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
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

9.7 max

構文

max

目的

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

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

<query id="test_max_timestamp"><![CDATA[ 
    select max(c2) from S15[range 2]
]]></query>
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
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:       + 

9.8 min

構文

min

目的

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

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

<query id="test_min_timestamp"><![CDATA[ 
    select min(c2) from S15[range 2]
]]></query>
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
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:       + 

9.9 sum

構文

sum

目的

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

問合せq3とデータ・ストリームS1があるとします。ストリームS1のスキーマは(c1 integer, c2 bigint)です。この問合せはリレーションを返します。rangeの詳細は、次を参照してください。

<query id="q3"><![CDATA[ 
    select sum(c2) from S1[range 5]
]]></query>
Timestamp   Tuple
1000         5,
1000        10,5
2000          ,4
3000        30,6
5000        45,44
7000        55,3
h 200000000
Timestamp   Tuple Kind  Tuple
 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:      +

9.10 xmlagg

構文

xml agg

目的

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

ORDER BY句を使用すると、フラグメントの順序を制御できます。

xmlagg関数とxmlelement関数

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

<query id="tkdata67_q1"><![CDATA[ 
    select 
        c1, 
        xmlagg(xmlelement("c2",c2)) 
    from 
        tkdata67_S0[rows 10] 
    group by c1
]]></query>
Timestamp           Tuple
 1000               15, 0.1
 1000               20, 0.14
 1000               15, 0.2
 4000               20, 0.3
10000               15, 0.04
h 12000
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句

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

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