データアグリゲーション

Version 25.3.9411


データアグリゲーション


API Server が公開するOData サービスは、OData 仕様に定義されている$apply キーワードを使用して、データの集約と変換をサポートします。

Aggregate

$apply キーワードは、カンマ区切りの集計式のリストを引数としてとるaggregate(...) 変換をサポートします。API Server は、指定された集計方法に対応する結果セットを返します。この結果セットは、元のテーブルリソースとは構造が異なる場合があります。

集計式

集計式は次の構文に従います:<ColumName> with <Method> as <Alias>。ここでは:

  • ColumnName:は集計方法が評価されるエンティティです
  • Method:はサポートされている集計方法です
  • Alias:は結果セットに集計結果を表示するためのOData で有効な名前です

サポートされる集計方法

API Server は以下の集計方法をサポートしています:

countdistinct 集計データセットで指定されたカラムの、異なる別個の値の数を返します
sum 集計データセットで指定されたカラムの値の合計を返します
max 集計データセットで指定されたカラムの最大値を返します
min 集計データセットで指定されたカラムの最小値を返します
average 集計データセットで指定されたカラムの算術平均を返します

仮想集計 $count

上記の集計方法に加えて、API Server は$count 仮想集計方法をサポートしています。このメソッドは、メインの集計方法とは異なる構文を使用します。カラムは指定せず、エイリアスのみを指定します:$count as <Alias>$count メソッドは、集約されたデータセット内の個別のエンティティの数を返します。

集計リクエストの例

集計変換のリクエストと結果セットの例を次に示します:

利用可能な製品の数を確認する

リクエスト

GET Products$apply=aggregate($count as Total)

レスポンス

{
    "value": [
         {"@odata.id": null, "Total": 24}
    ]
}

最大製品価格を持つ製品カテゴリの数を返す

リクエスト

GET Products?$apply=aggregate(Category with countdistinct as TotalCat, Price with max as MaxPrice)

レスポンス

{
    "value": [
        { "@odata.id": null, "TotalCat": 2, "MaxPrice": 1299.99}
    ]
}

Group By

$applyキーワードはgroupby(...) 変換もサポートします。この変換は、1つまたは2つの引数をとります。最初の引数は、かっこで囲まれたカラムのリストです。2番目の引数はオプションで、集約変換 式です。

グループ化プロパティ

groupby() 変換のグループ化プロパティ引数は、カンマ区切りのカラムのリストで、かっこで囲まれています。変換により、利用可能なエンティティがデータセットに分割されます。データセットでは、指定されたグループ化カラムはすべて等しくなります。

集約変換

groupby() と組み合わせて使用​​すると、集約変換は各データセットに個別に適用されます。集約変換の引数は、標準の集約と同じ構文を使用します。

シンプルなGroupby の例

これらの例では、groupby() 変換の最初の引数のみを指定します。

製品カテゴリの異なる値をすべて確認する

リクエスト

GET Products?$apply=groupby((Category))

レスポンス

{
    "value": [
        { "@odata.id": null, "Category": "Bike" },
        { "@odata.id": null, "Category": "Shoes" }
    ]
}

既存の製品におけるカテゴリと色の組み合わせをすべて確認する

リクエスト

GET Products?$apply=groupby((Category,Color))

レスポンス

{
    "value": [
        { "@odata.id": null, "Category": "Bike",  "Color": "Red"   },
        { "@odata.id": null, "Category": "Bike",  "Color": "Blue"  },
        { "@odata.id": null, "Category": "Shoes", "Color": "Black" },
        { "@odata.id": null, "Category": "Shoes", "Color": "Blue"  },
        { "@odata.id": null, "Category": "Shoes", "Color": "Red"   }
    ]
}

Groupby とAggregation の例

これらの例では、groupby() 変換の両方の引数を指定します。

各製品カテゴリで最も安いアイテムを確認する

リクエスト

GET Products?$apply=groupby((Category), aggregate(Price with min as MinPrice))

レスポンス

{
    "value": [
        { "@odata.id": null, "Category": "Bike",  "MinPrice": 120},
        { "@odata.id": null, "Category": "Shoes", "MinPrice": 30}
    ]
}

カテゴリと色のすべての組み合わせにおける在庫数と平均価格を確認する

リクエスト

GET Products?$apply=groupby((Category,Color), aggregate($count as AvailProd, Price with average as AverageCost))

レスポンス

{
    "value": [
        { "@odata.id": null, "Category": "Bike",  "Color": "Red"  , "AvailProd": 12, "AverageCost": 514.34 },
        { "@odata.id": null, "Category": "Bike",  "Color": "Blue" , "AvailProd": 7,  "AverageCost": 520.17 },
        { "@odata.id": null, "Category": "Shoes", "Color": "Black", "AvailProd": 2, "AverageCost": 89.64   },
        { "@odata.id": null, "Category": "Shoes", "Color": "Blue" , "AvailProd": 9, "AverageCost": 79.84   },
        { "@odata.id": null, "Category": "Shoes", "Color": "Red"  , "AvailProd": 4, "AverageCost": 98.63   }
    ]
}

データアグリゲーションとフィルタリング

API Server は、データ集約クエリによるフィルタリングをサポートしています。フィルタを集計の結果に適用することも、集計をフィルタ変換の結果に適用することもできます。

集約データのフィルタリング

OData キーワード$filter$orderby$top および$skip は、集計の結果に適用されます。$skip を指定する場合は、$orderby 値も設定する必要があります。

リクエスト

GET Products?$apply=groupby((Color), aggregate($count as Total))&$filter=Total gt 0&$orderby=Total

レスポンス

{
    "value": [
        {"@odata.id": null, "Color": "Blue",  "Total": "1"},
        {"@odata.id": null, "Color": "Red",   "Total": "15"},
        {"@odata.id": null, "Color": "Green", "Total": "32"},
        {"@odata.id": null, "Color": "Black", "Total": "44"}
    ]
}

フィルタリングされたデータの集約

集計前にデータにフィルタを適用するには、OData キーワードの$apply を使用してfilter(...) 変換をサポートします。フィルタの値は、$filter キーワードを使用するOData のフィルタと同じです。集約はフィルタリングされたデータの結果に適用されます。

リクエスト

GET Products?$apply=filter(ProductCategoryId eq 10)/groupby((Color, ProductCategoryId), aggregate($count as Total))

レスポンス

{
    "value": [
        {"@odata.id": null, "ProductCategoryId": 10, "Color": "Red",   "Total": 8},
        {"@odata.id": null, "ProductCategoryId": 10, "Color": "Green", "Total": 12}
    ]
}