順序集計関数
順序集計関数は、対応する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
例6-21 航空会社手荷物追跡アプリケーションで受託手荷物の数、旅行経路およびフライト数に関する自動メッセージを乗客に表示する
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-22 ユーザーの歩数追跡詳細をユーザー・データ・アプリケーションから取得する
一定期間にわたる各ユーザーの歩数を追跡するためのフィールド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}