順序集計関数

順序集計関数は、対応するSQL集計関数と同じルールを使用して、入力順序の項目を集計します。

たとえば、seq_sum()では、SQLのsum()と同じように、入力順序で数値以外の項目がスキップされ、実際の戻り値の型(long、doubleまたはnumber)が決定されます。唯一の例外はseq_count()です。これは、SQLのcount()とは異なり、その入力項目のいずれかがNULLの場合はNULLを返します。また、順序集計関数の表示場所に制限はありません(たとえば、WHERE句やSELECT句のいずれかまたは両方で使用できます)。

ノート:

ノート: 1つの配列は、1つの項目の順序です。配列の要素を集計するには、[]を使用して配列のボックス化を解除する必要があります。

次の順序集計関数がサポートされています。

  • long seq_count(any*)
  • number seq_sum(any*)
  • number seq_avg(any*)
  • any_atomic seq_min(any*)
  • any_atomic seq_max(any*)

ノート:

すべての順序集計関数の名前は、大文字と小文字が区別されます。

seq_count関数

入力順序内の項目の数を返します。この入力式の評価は、count関数と似ています。

構文:
long seq_count(any*)
セマンティクス:

any: seq_count関数で、入力引数としてすべてのパラメータ・タイプが受け入れられます。

戻り型: long

seq_sum関数

入力順序の数値項目の合計を返します。この入力式の評価は、sum関数と似ています。

構文:
number seq_sum(any*)
セマンティクス:

any: seq_sum関数で、入力引数としてすべてのパラメータ・タイプが受け入れられます。

戻り型: number

seq_avg関数

入力順序の数値項目の平均を返します。この入力式の評価は、avg関数と似ています。

構文:
number seq_avg(any*)
セマンティクス:

any: seq_avg関数で、入力引数としてすべてのパラメータ・タイプが受け入れられます。

戻り型: number

seq_min関数

入力順序の項目の最小を返します。この入力式の評価は、min関数と似ています。

構文:
any_atomic seq_min(any*)
セマンティクス:

any: seq_min関数で、入力引数としてすべてのパラメータ・タイプが受け入れられます。

戻り型: アトミック・データ型

seq_max関数

入力順序での項目の最大値を返します。この入力式の評価は、max関数と似ています。

構文:
any_atomic seq_max(any*)
セマンティクス:

any: seq_max関数で、入力引数としてすべてのパラメータ・タイプが受け入れられます。

戻り型: アトミック・データ型

例6-26 航空会社手荷物追跡アプリケーションで受託手荷物の数、旅行経路およびフライト数に関する自動メッセージを乗客に表示する

SELECT fullName,
b.baginfo[0].routing,
size(baginfo) AS BAGS,
    CASE
        WHEN seq_count(b.bagInfo[0].flightLegs.flightNo) = 1
        THEN "You have one flight to catch"
        WHEN seq_count(b.bagInfo[0].flightLegs.flightNo) = 2
        THEN "You have two flights to catch"
        WHEN seq_count(b.bagInfo[0].flightLegs.flightNo) = 3
        THEN "You have three flights to catch"
        ELSE "You do not have any travel listed today"
    END AS FlightInfo
FROM BaggageInfo b
WHERE ticketNo = 1762320369957

説明: 例5-2では、乗客に、今度の旅行のフライト数、受託手荷物の数および経路詳細について素早く確認できるメッセージが表示されると便利です。bagInfo配列には、乗客の受託手荷物詳細が保持されています。bagInfo配列のサイズで、乗客ごとの受託手荷物の数を特定できます。bagInfo内のflightLegs配列には、各移動区間に対応するフライト詳細が含まれています。routingフィールドには、すべての移動断片の空港コードが含まれています。フライトの数は、flightLegs配列内のflightNoフィールドをカウントすることで特定できます。乗客に複数の受託手荷物がある場合、bagInfo配列には、手荷物ごとに1つで、複数の要素があります。このような場合は、乗客データのbagInfoフィールドのすべての要素で、flightLegs配列に同じ値が含まれます。これは、乗客のすべての受託手荷物の到着地が同じであるためです。flightNoフィールドをカウントする際は、bagInfo配列の要素を1つのみ考慮に入れて、結果が重複しないようにする必要があります。この問合せでは、最初の要素(つまりbagInfo[0])のみを考慮に入れています。flightLegs配列には移動断片ごとにflightNoフィールドがあるため、これは順序であり、seq_count関数を使用して乗客ごとのflightNoフィールドの数を特定しています。

フライト数に基づいて異なるメッセージを取り入れるために、CASE文を使用しています。使いやすくするために、問合せでは3つの経由地のみが考慮に入れられています。

出力:
{"fullName":"Lorenzo Phil","routing":"SFO/IST/ATH/JTR","BAGS":2,"FlightInfo":"You have three flights to catch"}

例6-27 ユーザーの歩数追跡詳細をユーザー・データ・アプリケーションから取得する

一定期間にわたる各ユーザーの歩数を追跡するためのフィールドstepCountがさらに含まれているusers表について考えてみます。表スキーマは次のとおりです。

CREATE TABLE users ( id INTEGER,
                     firstName STRING,
                     lastName STRING,
                     otherNames ARRAY(RECORD(first STRING, last STRING)),
                     age INTEGER,
                     income INTEGER,
                     address JSON,
                     connections ARRAY(INTEGER),
                     stepCount ARRAY(LONG),
PRIMARY KEY (id) )

次のサンプル・データを挿入します。

INSERT INTO users VALUES ( 

   10,   
   "John",
   "Smith",
   [ {"first" : "Johny", "last" : "Good"}, {"first" : "Johny2", "last" : "Brave"},{"first" : "Johny3", "last" : "Kind"},{"first" : "Johny4", "last" : "Humble"} ],
   22,
   45000,
   {
      "street" : "Pacific Ave",
      "number" : 101,
      "city" : "Santa Cruz",
      "state" : "CA",
      "zip" : 95008,
      "phones" : [
         { "area" : 408, "number" : 4538955, "kind" : "work" },
         { "area" : 831, "number" : 7533341, "kind" : "home" },
         { "area" : 831, "number" : 7533382, "kind" : "mobile" }
      ]
   },
   [ 30, 55, 43 ],
   [ 2000, 1500, 2700, 3000, 1000, 4000, 6000]
)

ユーザーは、一定期間のこのデータの集計に基づいて、健康促進法を計画できます。

SELECT id,
firstName,
seq_count(u.stepCount[]) AS DAYS,
seq_sum(u.stepCount[]) AS TOTAL_STEPS,
seq_avg(u.stepCount[]) AS AVERAGE_STEPS,
seq_min(u.stepCount[]) AS LOWEST,
seq_max(u.stepCount[]) AS HIGHEST
FROM users u
WHERE id=10

説明: users表内のstepCountフィールドは、long型の配列です。この配列内の各要素は、ユーザーの1日当たりの歩数を表しています。順序集計関数を使用して、一定期間にわたるユーザーの歩数の合計、平均、最低値および最高値の詳細をフェッチできます。

出力:
{"id":10,"firstName":"John","DAYS":7,"TOTAL_STEPS":20200,"AVERAGE_STEPS":2885.714285714286,"LOWEST":1000,"HIGHEST":6000}