すべてのプロダクト
Search
ドキュメントセンター

Tablestore:集計

最終更新日:Feb 11, 2025

行の最小値、最大値、合計、平均値、カウント、個別カウントを取得するための集計操作を実行できます。 また、フィールド値、範囲、地理的位置、フィルタ、ヒストグラム、または日付ヒストグラム別に結果をグループ化し、ネストされたクエリを実行するための集計操作を実行することもできます。 複雑なクエリに対して複数の集計操作を実行できます。

背景情報

次の表は、集計方法について説明しています。

メソッド

説明

最小値

フィールドの最小値を返すために使用できる集計方法です。 このメソッドは、SQL MIN 関数と同様の方法で使用できます。

最大値

フィールドの最大値を返すために使用できる集計方法です。 このメソッドは、SQL MAX 関数と同様の方法で使用できます。

合計

数値フィールドのすべての値の合計を返すために使用できる集計方法です。 このメソッドは、SQL SUM 関数と同様の方法で使用できます。

平均値

数値フィールドのすべての値の平均を返すために使用できる集計方法です。 このメソッドは、SQL AVG 関数と同様の方法で使用できます。

カウント

特定のフィールドの値の総数または多次元インデックス内の行の総数を返すために使用できる集計方法です。 このメソッドは、SQL COUNT 関数と同様の方法で使用できます。

個別カウント

フィールドの個別値の数を返すために使用できる集計方法です。 このメソッドは、SQL COUNT(DISTINCT) 関数と同様の方法で使用できます。

フィールド値によるグループ化

フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法です。 同じ値は一緒にグループ化されます。 各グループの同一の値と各グループ内の同一の値の数が返されます。

説明

グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。

複数フィールドによるグループ化

複数のフィールドに基づいてクエリ結果をグループ化するために使用できる集計方法です。 トークンを使用してページングを実行できます。

範囲によるグループ化

フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法です。 指定された範囲内にあるフィールド値は一緒にグループ化されます。 各範囲の値の数が返されます。

地理的位置によるグループ化

地理的位置から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法です。 指定された範囲内にある距離のクエリ結果は一緒にグループ化されます。 各範囲内の項目数が返されます。

フィルタによるグループ化

クエリ結果をフィルタリングし、各フィルタに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法です。 結果は、フィルタが指定された順序で返されます。

ヒストグラムによるクエリ

特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。 同じ範囲内にあるフィールド値は一緒にグループ化されます。 各グループの値の範囲と各グループ内の値の数が返されます。

日付ヒストグラムによるクエリ

特定の日日間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。 同じ範囲内にあるフィールド値は一緒にグループ化されます。 各グループの値の範囲と各グループ内の値の数が返されます。

ネスト

GroupBy はネストをサポートしています。 GroupBy を使用してサブ集計操作を実行できます。

複数集計

複数の集計操作を実行できます。

説明

複数の複雑な集計操作を同時に実行すると、長時間を要する場合があります。

前提条件

最小値

フィールドの最小値を返すために使用できる集計方法です。 このメソッドは、SQL MIN 関数と同様の方法で使用できます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 LONG、DOUBLE、および DATE データ型のみがサポートされています。

    Missing

    フィールド値が空の行で集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

  • /**
     * 各製品の価格は製品テーブルに記載されています。浙江省で生産されている製品の最低価格をクエリします。
     * 同等の SQL 文:SELECT min(column_price) FROM product where place_of_production="Zhejiang";
     */
    func min(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}).
                SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limit を 0 に設定してクエリのパフォーマンスを向上させることができます。
                Aggregation(search.NewMinAggregation("min_agg_1", "column_price").Missing(0.00)))
    
        searchResponse, err := client.Search(searchRequest) // 文を実行します。
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        agg1, err := aggResults.Min("min_agg_1") // min_agg_1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg1.HasValue() { // min_agg_1 という名前の集計操作の結果に値が含まれているかどうかを確認します。
            fmt.Println(agg1.Value) // 集計結果を表示します。
        }
    }

最大値

フィールドの最大値を返すために使用できる集計方法です。 このメソッドは、SQL MAX 関数と同様の方法で使用できます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 LONG、DOUBLE、および DATE データ型のみがサポートされています。

    Missing

    フィールド値が空の行で集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

  • /**
     * 各製品の価格は製品テーブルに記載されています。浙江省で生産されている製品の最高価格をクエリします。
     * 同等の SQL 文:SELECT max(column_price) FROM product where place_of_production = "Zhejiang Province".
     */
    func max(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}).
                SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limit を 0 に設定してクエリのパフォーマンスを向上させることができます。
                Aggregation(search.NewMaxAggregation("max_agg_1", "column_price").Missing(0.00)))
    
        searchResponse, err := client.Search(searchRequest) // 文を実行します。
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        agg1, err := aggResults.Max("max_agg_1") // max_agg_1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg1.HasValue() { // max_agg_1 という名前の集計操作の結果に値が含まれているかどうかを確認します。
            fmt.Println(agg1.Value) // 集計結果を表示します。
        }
    }

合計

数値フィールドのすべての値の合計を返すために使用できる集計方法です。 このメソッドは、SQL SUM 関数と同様の方法で使用できます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 LONG および DOUBLE データ型のみがサポートされています。

    Missing

    フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

  • /**
     * 各製品の売上高は製品テーブルに記載されています。浙江省で生産されている販売済み製品の総数をクエリします。製品の売上が空の場合、デフォルト値として 10 が使用されます。
     * 同等の SQL 文:SELECT sum(column_price) FROM product where place_of_production = "Zhejiang".
     */
    func sum(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}).
                SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limit を 0 に設定してクエリのパフォーマンスを向上させることができます。
                Aggregation(search.NewSumAggregation("sum_agg_1", "column_price").Missing(0.00)))
    
        searchResponse, err := client.Search(searchRequest) // 文を実行します。
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        agg1, err := aggResults.Sum("sum_agg_1") // sum_agg_1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println(agg1.Value) // 集計結果を表示します。
    }

平均値

数値フィールドのすべての値の平均を返すために使用できる集計方法です。 このメソッドは、SQL AVG 関数と同様の方法で使用できます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 LONG、DOUBLE、および DATE データ型のみがサポートされています。

    Missing

    フィールド値が空の行で集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

  • /**
     * 各製品の売上高は製品テーブルに記載されています。浙江省で生産されている製品の平均価格をクエリします。
     * 同等の SQL 文:SELECT avg(column_price) FROM product where place_of_production = "Zhejiang Province".
     */
    func avg(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}).
                SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limit を 0 に設定してクエリのパフォーマンスを向上させることができます。
                Aggregation(search.NewAvgAggregation("avg_agg_1", "column_price").Missing(0.00)))
    
        searchResponse, err := client.Search(searchRequest) // 文を実行します。
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        agg1, err := aggResults.Avg("avg_agg_1") // avg_agg_1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg1.HasValue() { // agg1 という名前の集計操作の結果に値が含まれているかどうかを確認します。
            fmt.Println(agg1.Value) // 集計結果を表示します。
        }
    }

カウント

特定のフィールドの値の総数または多次元インデックス内の行の総数を返すために使用できる集計方法です。 このメソッドは、SQL COUNT 関数と同様の方法で使用できます。

説明

次の方法を使用して、多次元インデックス内の行の総数またはクエリ条件を満たす行の総数をクエリできます。

  • 集計のカウント機能を使用し、リクエストで count(*) を指定します。

  • クエリ機能を使用して、クエリ条件を満たす行の数を取得します。 クエリで setGetTotalCount を true に設定します。 MatchAllQuery を使用して、多次元インデックス内の行の総数を取得します。

列の名前を count 式の値として使用して、多次元インデックス内の列を含む行の数をクエリできます。 このメソッドは、スパース列を含むシナリオに適しています。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 サポートされているデータ型は、LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、および DATE のみです。

  • /**
     * 加盟店のペナルティレコードは加盟店テーブルに記録されます。浙江省に所在し、ペナルティレコードが存在する加盟店の数をクエリできます。加盟店にペナルティレコードが存在しない場合、ペナルティレコードに対応するフィールドも加盟店には存在しません。
     * 同等の SQL 文:SELECT count(column_history) FROM product where place_of_production = "Zhejiang Province".
     */
    func count(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}).
                SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limit を 0 に設定してクエリのパフォーマンスを向上させることができます。
                Aggregation(search.NewCountAggregation("count_agg_1", "column_price")))
    
        searchResponse, err := client.Search(searchRequest) // 文を実行します。
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        agg1, err := aggResults.Count("count_agg_1") // count_agg_1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println(agg1.Value) // 集計結果を表示します。
    }

個別カウント

フィールドの個別値の数を返すために使用できる集計方法です。 このメソッドは、SQL COUNT(DISTINCT) 関数と同様の方法で使用できます。

説明

個別値の数は概数です。

  • 個別カウント機能を使用する前の行の総数が 10,000 未満の場合、計算結果は正確な値に近くなります。

  • 個別カウント機能を使用する前の行の総数が 1 億以上の場合、エラー率は約 2% です。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 サポートされているデータ型は、LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、および DATE のみです。

    Missing

    フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

  • /**
     * 製品が生産されている県の個別数をクエリします。
     * 同等の SQL 文:SELECT count(distinct column_place) FROM product.
     */
    func distinctCount(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}).
                SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limit を 0 に設定してクエリのパフォーマンスを向上させることができます。
                Aggregation(search.NewDistinctCountAggregation("distinct_count_agg_1", "column_price").Missing(0.00)))
    
        searchResponse, err := client.Search(searchRequest) // 文を実行します。
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        agg1, err := aggResults.DistinctCount("distinct_count_agg_1") // distinct_count_agg_1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println(agg1.Value) // 集計結果を表示します。
    }

フィールド値によるグループ化

フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法です。 同じ値は一緒にグループ化されます。 各グループの同一の値と各グループ内の同一の値の数が返されます。

説明

グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 サポートされているデータ型は、LONG、DOUBLE、BOOLEAN、KEYWORD、および DATE のみです。

    Size

    返されるグループの数です。 デフォルト値:10。 最大値:2000。 グループの数が 2,000 を超える場合、最初の 2,000 グループのみが返されます。

    GroupBySorters

    グループ内の項目のソート規則です。 デフォルトでは、グループ項目は降順にソートされます。 複数のソート規則を設定した場合、データは規則が設定された順序に基づいてソートされます。 次のソート規則がサポートされています。

    • 値でアルファベット順にソート

    • 値でアルファベットの逆順にソート

    • 行数で昇順にソート

    • 行数で降順にソート

    • サブ集計結果から取得された値で昇順にソート

    • サブ集計結果から取得された値で降順にソート

    SubAggregation および SubGroupBy

    サブ集計操作です。 グループ化結果に基づいてサブ集計操作を実行できます。

    • シナリオ

      各カテゴリの製品数と、各カテゴリの製品の最高価格と最低価格をクエリします。

    • メソッド

      製品カテゴリ別にクエリ結果をグループ化して、各カテゴリの製品数を取得します。 次に、2 つのサブ集計操作を実行して、各カテゴリの製品の最高価格と最低価格を取得します。

    • 結果例

      • 果物:5。 価格の最大値は 15 です。 価格の最小値は 3 です。

      • トイレタリー:10。 価格の最大値は 98 です。 価格の最小値は 1 です。

      • 電子機器:3。 価格の最大値は 8,699 です。 価格の最小値は 2,300 です。

      • その他の製品:15。 価格の最大値は 1,000 です。 価格の最小値は 80 です。

  • /**
     * 各カテゴリの製品数と、製品の最高価格と最低価格をクエリします。
     * 返される結果の例:果物:5。 価格の最大値は 15、価格の最小値は 3 です。 トイレタリー:10。 価格の最大値は 98、価格の最小値は 1 です。 電子機器:3。 価格の最大値は 8699、価格の最小値は 2300 です。
     * その他の製品:15。 価格の最大値は 1000、価格の最小値は 80 です。
     */
    func GroupByField(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
                SetLimit(0).
                GroupBy(search.NewGroupByField("group1", "column_type"). // 製品をカテゴリ別にグループ化します。
                    SubAggregation(search.NewMinAggregation("min_price", "column_price")). // 各カテゴリの最低価格をクエリします。
                    SubAggregation(search.NewMaxAggregation("max_price", "column_price")))) // 各カテゴリの最高価格をクエリします。
    
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
        group, err := groupByResults.GroupByField("group1")
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
    
        for _, item := range group.Items { // 返されたグループをトラバースします。
            // 各グループの値と各グループ内の行数を表示します。
            fmt.Println("\tkey: ", item.Key, ", rowCount: ", item.RowCount)
    
            // 最低価格を表示します。
            minPrice, _ := item.SubAggregations.Min("min_price")
            if minPrice.HasValue() {
                fmt.Println("\t\tmin_price: ", minPrice.Value)
            }
    
            // 最高価格を表示します。
            maxPrice, _ := item.SubAggregations.Max("max_price")
            if maxPrice.HasValue() {
                fmt.Println("\t\tmax_price: ", maxPrice.Value)
            }
        }
    }

複数フィールドによるグループ化

複数のフィールドに基づいてクエリ結果をグループ化するために使用できる集計方法です。 トークンを使用してページングを実行できます。

説明

複数のフィールドに基づいてクエリ結果をグループ化する場合、ネストモードで groupBy パラメータを使用するか、GroupByComposite パラメータを使用できます。 groupBy パラメータと GroupByComposite パラメータの違いについては、「付録:複数フィールドグループ化のさまざまな方法」をご参照ください。

  • パラメータ

    パラメータ

    説明

    GroupByName

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    SourceGroupByList

    クエリ結果をグループ化するフィールドです。 最大 32 のフィールドでクエリ結果をグループ化し、結果のグループに対して集計操作を実行できます。 次のグループタイプがサポートされています。

    重要
    • SourceGroupByList パラメータで指定されたグループタイプの場合、GroupBySorter パラメータを groupKeySort のみに設定できます。

    • デフォルトでは、グループは降順にソートされます。

    • 列にフィールド値が存在しない場合、システムは NULL を返します。

    • GroupByField タイプの場合、設定できるパラメータは GroupByName、FieldName、および GroupBySorter のみです。

    • GroupByHistogram タイプの場合、設定できるパラメータは GroupByName、FieldName、Interval、および GroupBySorter のみです。

    • GroupByDateHistogram タイプの場合、設定できるパラメータは GroupByName、FieldName、Interval、TimeZone、および GroupBySorter のみです。

    NextToken

    次のリクエストで使用して新しいページのグループを取得するページネーショントークンです。 NextToken パラメータの値は、GroupByCompositeResult 操作の出力から取得できます。 NextToken パラメータを使用すると、すべてのグループ化結果を取得できます。

    Size

    ページあたりのグループ数です。 要件を満たすグループの数が Size パラメータの値を超える場合、NextToken パラメータを使用して次のページのグループを取得する必要があります。

    重要

    返すグループの数を制限する場合、Size パラメータと SuggestedSize パラメータを同時に設定することはできません。 ほとんどの場合、Size パラメータを設定することをお勧めします。

    Tablestore を Apache Spark や PrestoSQL などの高スループットコンピューティングエンジンと相互接続するシナリオでは、SuggestedSize パラメータを設定することをお勧めします。

    SuggestedSize

    ページあたりの予想グループ数です。 サーバー側で許可される最大グループ数より大きい値または -1 を設定できます。 サーバー側は、その容量に基づいて実際のグループ数を返します。 このパラメータは、Tablestore を Apache Spark や PrestoSQL などの高スループットコンピューティングエンジンと相互接続するシナリオに適用できます。

    このパラメータをサーバー側で許可される最大グループ数より大きい値に設定すると、システムは値をサーバー側で許可される最大グループ数に調整します。 返される実際のグループ数は、min(suggestedSize, サーバー側で許可される最大グループ数, グループの総数) となります。

    SubAggList および SubGroupByList

    サブ集計操作です。 グループ化結果に基づいてサブ集計操作を実行できます。

    重要

    GroupByComposite タイプは、SubGroupByList パラメータではサポートされていません。

  • /**
     * クエリ結果のグループ化と集計:SourceGroupBy パラメータに渡された groupbyField、groupByHistogram、groupByDataHistogram などのパラメータに基づいて、クエリ結果をグループ化し、結果のグループに対して集計操作を実行します。
     * 複数フィールドの集計結果をフラットな構造で返します。
     */
    func GroupByComposite(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
        searchRequest.
            SetTableName(tableName).
            SetIndexName(indexName).
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}).
                SetLimit(0).
                GroupBy(search.NewGroupByComposite("groupByComposite").
                SourceGroupBys(search.NewGroupByField("groupByColLong", "Col_Long"),
                    search.NewGroupByField("groupByColKeyword", "Col_Keyword"),
                    search.NewGroupByField("groupByColDouble", "Col_Double")).
                SetSize(100)))
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v\n", err)
            return
        }
    
        for {
            if searchResponse.GroupByResults.Empty() {
                return
            }
    
            groupByResults := searchResponse.GroupByResults
            group, err := groupByResults.GroupByComposite("groupByComposite")
            if err != nil {
                fmt.Printf("%#v\n", err)
                return
            }
    
            if group == nil {
                return
            }
    
            for _, item := range group.Items { // 返されたグループをトラバースします。
                // 各グループの値と各グループ内の行数を表示します。
                if item.Keys != nil {
                    for i := 0; i < len(item.Keys); i++ {
                        if item.Keys[i] == nil {
                            fmt.Printf(" null ")
                        } else {
                            fmt.Printf(" %v ", *item.Keys[i])
                        }
    
                    }
                    fmt.Printf("\trowCount:%v\n", item.RowCount)
                }
            }
    
            if group.NextToken != nil {
                searchRequest.
                    SetTableName(tableName).
                    SetIndexName(indexName).
                    SetSearchQuery(search.NewSearchQuery().
                        SetQuery(&search.MatchAllQuery{}).
                        SetLimit(0).
                        GroupBy(search.NewGroupByComposite("groupByComposite").
                            SourceGroupBys(search.NewGroupByField("groupByColLong", "Col_Long"),
                                search.NewGroupByField("groupByColKeyword", "Col_Keyword"),
                                search.NewGroupByField("groupByColDouble", "Col_Double")).
                            SetSize(100).
                            SetNextToken(group.NextToken)))
    
                searchResponse, err = client.Search(searchRequest)
                if err != nil {
                    fmt.Printf("%#v\n", err)
                    return
                }
            } else {
                break
            }
        }
    }

範囲によるグループ化

フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法です。 指定された範囲内にあるフィールド値は一緒にグループ化されます。 各範囲の値の数が返されます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前です。 LONG および DOUBLE データ型のみがサポートされています。

    Range(fromInclusive float64, toExclusive float64)

    グループ化に使用される値の範囲です。

    範囲は NegInf から開始し、Inf で終了できます。

    SubAggregation および SubGroupBy

    サブ集計操作です。 グループ化結果に基づいてサブ集計操作を実行できます。

    たとえば、売上高と県別にクエリ結果をグループ化した後、指定された範囲で売上高の割合が最も大きい県を取得できます。 これを行うには、GroupByRange で GroupByField を指定する必要があります。

  • /**
     * [NegInf, 1000)、[1000, 5000)、[5000, Inf) の範囲に基づいて売上数量をグループ化し、各範囲の売上数量を取得します。
     */
    func GroupByRange(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
                SetLimit(0).
                GroupBy(search.NewGroupByRange("group1", "column_number").
                    Range(search.NegInf, 1000).
                    Range(1000, 5000).
                    Range(5000, search.Inf)))
    
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
        group, err := groupByResults.GroupByRange("group1")
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        for _, item := range group.Items { // 返されたグループをトラバースします。
            fmt.Println("\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount) // 各グループの行数を表示します。
        }
    }

地理的位置によるグループ化

地理的位置から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法です。 指定された範囲内にある距離のクエリ結果は一緒にグループ化されます。 各範囲内の項目数が返されます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    FieldName

    集計操作に使用されるフィールドの名前です。 GEO_POINT データ型のみがサポートされています。

    CenterPoint(latitude float64, longitude float64)

    中心点の経度と緯度です。

    latitude は中心点の緯度を指定します。 longitude は中心点の経度を指定します。

    Range(fromInclusive float64, toExclusive float64)

    グループ化に使用される距離範囲です。 単位:メートル。

    範囲は NegInf から開始し、Inf で終了できます。

    SubAggregation および SubGroupBy

    サブ集計操作です。 グループ化結果に基づいてサブ集計操作を実行できます。

  • 
    /**
     * ユーザーを地理的位置から万達広場までの距離に基づいてグループ化し、各距離範囲内のユーザー数を取得します。 距離範囲は [NegInf, 1000)、[1000, 5000)、[5000, Inf) です。 単位:メートル。
     */
    func GroupByGeoDistance(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
                SetLimit(0).
                GroupBy(search.NewGroupByGeoDistance("group1", "Col_GeoPoint", search.GeoPoint{Lat: 30.137817, Lon:120.08681}).
                    Range(search.NegInf, 1000).
                    Range(1000, 5000).
                    Range(5000, search.Inf)))
    
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
        group, err := groupByResults.GroupByGeoDistance("group1")
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        for _, item := range group.Items { // 返されたグループをトラバースします。
            fmt.Println("\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount) // 各グループの行数を表示します。
        }
    }

フィルタによるグループ化

クエリ結果をフィルタリングし、各フィルタに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法です。 結果は、フィルタが指定された順序で返されます。

  • パラメータ

    パラメータ

    説明

    Name

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    Query

    クエリに使用できるフィルタです。 結果は、フィルタ条件が指定された順序で返されます。

    SubAggregation および SubGroupBy

    サブ集計操作です。 グループ化結果に基づいてサブ集計操作を実行できます。

  • /**
     * 売上高が 100 を超え、原産地が浙江省で、説明に杭州が含まれている項目の数を取得するために次のフィルタを指定します。
     */
    func GroupByFilter(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
                SetLimit(0).
                GroupBy(search.NewGroupByFilter("group1").
                    Query(&search.RangeQuery{
                        FieldName: "number",
                        From: 100,
                        IncludeLower: true}).
                    Query(&search.TermQuery{
                        FieldName: "place",
                        Term:      "Zhejiang",
                    }).
                    Query(&search.MatchQuery{
                        FieldName: "description",
                        Text: "Hangzhou",
                    })))
    
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
        group, err := groupByResults.GroupByFilter("group1")
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        for _, item := range group.Items { // 返されたグループをトラバースします。
            fmt.Println("\trowCount: ", item.RowCount) // 各グループの行数を表示します。
        }
    }

ヒストグラムによるグループ化

特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。 同じ範囲内にあるフィールド値は一緒にグループ化されます。 各グループの値の範囲と各グループ内の値の数が返されます。

  • パラメータ

    パラメータ

    説明

    GroupByName

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    Field

    集計操作を実行するために使用されるフィールドの名前です。 LONG および DOUBLE データ型のみがサポートされています。

    Interval

    集計結果を取得するために使用される日付間隔です。

    FieldRange[min,max]

    Interval パラメータと一緒に使用してグループの数を制限する範囲です。 (FieldRange.max-FieldRange.min)/interval の式を使用して計算された値は 2000 を超えることはできません。

    MinDocCount

    最小行数です。 グループ内の行数が最小行数より少ない場合、グループの集計結果は返されません。

    Missing

    フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

  • func GroupByHistogram(client *tablestore.TableStoreClient, tableName string, indexName string) {
    	searchRequest := &tablestore.SearchRequest{}
    	searchRequest.
    		request.setTableName(tableName); // データテーブルの名前を指定します。
    		request.setIndexName(indexName); // 多次元インデックスの名前を指定します。
    		SetSearchQuery(search.NewSearchQuery().
    			SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
    			SetLimit(0).
    			GroupBy(search.NewGroupByHistogram("group1", "field_name").
    				SetMinDocCount(1).
    				SetFiledRange(1, 100).
    				SetMissing(3).
    				SetInterval(10)))
    
    	searchResponse, err := client.Search(searchRequest)
    	if err != nil {
    		fmt.Printf("%#v", err)
    		return
    	}
    	groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
    	group, err := groupByResults.GroupByHistogram("group1")
    	if err != nil {
    		fmt.Printf("%#v", err)
    		return
    	}
    	for _, item := range group.Items { // 返されたグループをトラバースします。
    		fmt.Println("key:", item.Key.Value, ", rowCount:", item.Value)
    	}
    }

日付ヒストグラムによるグループ化

特定の日日間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。 同じ範囲内にあるフィールド値は一緒にグループ化されます。 各グループの値の範囲と各グループ内の値の数が返されます。

  • パラメータ

    パラメータ

    説明

    GroupByName

    集計操作の一意の名前です。 この名前を使用して特定の集計操作の結果をクエリできます。

    Field

    集計操作を実行するために使用されるフィールドの名前です。 DATE データ型のみがサポートされています。

    Interval

    集計結果を取得するために使用される日付間隔です。

    FieldRange[min,max]

    Interval パラメータと一緒に使用してグループの数を制限する範囲です。 (FieldRange.max-FieldRange.min)/interval の式を使用して計算された値は 2000 を超えることはできません。

    MinDocCount

    最小行数です。 グループ内の行数が最小行数より少ない場合、グループの集計結果は返されません。

    Missing

    フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。

    • Missing に値を指定しない場合、行は無視されます。

    • Missing に値を指定した場合、このパラメータの値が行のフィールド値として使用されます。

    TimeZone

    +hh:mm または -hh:mm 形式(+08:00-09:00 など)のタイムゾーンです。 このパラメータは、フィールドが DATE データ型の場合にのみ必須です。

    DATE データ型のフィールドにこのパラメータを指定しないと、集計結果に N 時間のオフセットが発生する場合があります。 このパラメータを指定することでこのエラーを解決できます。

  • func GroupByDateHistogram(client *tablestore.TableStoreClient, tableName string, indexName string) {
    	searchRequest := &tablestore.SearchRequest{}
    	searchRequest.
    		request.setTableName(tableName); // データテーブルの名前を指定します。
    		request.setIndexName(indexName); // 多次元インデックスの名前を指定します。
    		SetSearchQuery(search.NewSearchQuery().
    			SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
    			SetLimit(0).
    			GroupBy(search.NewGroupByDateHistogram("date_group", "date_field_name").
    				SetMinDocCount(1).
    				SetFiledRange("2017-05-01 10:00", "2017-05-21 13:00:00").
    				SetMissing("2017-05-01 13:01:00").
    				SetInterval(model.DateTimeValue{
    					Value: proto.Int32(1),
    					Unit:  model.DateTimeUnit_DAY.Enum(),
    				})))
    
    	searchResponse, err := client.Search(searchRequest)
    	if err != nil {
    		fmt.Printf("%#v", err)
    		return
    	}
    	groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
    	group, err := groupByResults.GroupByDateHistogram("date_group")
    	if err != nil {
    		fmt.Printf("%#v", err)
    		return
    	}
    
    	for _, item := range group.Items { // 返されたグループをトラバースします。
    		fmt.Printf("millisecondTimestamp:%d , rowCount:%d \n", item.Timestamp, item.RowCount)
    	}
    }

ネスト

GroupBy はネストをサポートしています。 GroupBy を使用してサブ集計操作を実行できます。

ネストを使用して、グループ内でサブ集計操作を実行できます。 次の例は、2 レベルのネストを使用した集計操作を示しています。

  • GroupBy + SubGroupBy:行を県と市別にグループ化して、各県の各市のデータを取得します。

  • GroupBy + SubAggregation:行を県別にグループ化し、集計操作を実行して、各県のメトリックの最大値を取得します。

説明

複雑な GroupBy 操作の高パフォーマンスを確保するために、ネストのレベル数を少なく指定できます。 詳細については、「多次元インデックスの制限」をご参照ください。

/**
 * ネストベースの集計を実行します。
 * GroupByField の最外レベルでは、2 つの集計と 1 つの GroupByRange 属性が指定されています。
 */
func NestedSample(client *tablestore.TableStoreClient, tableName string, indexName string) {
    searchRequest := &tablestore.SearchRequest{}

    searchRequest.
        SetTableName(tableName). // データテーブルの名前を指定します。
        SetIndexName(indexName). // 多次元インデックスの名前を指定します。
        SetSearchQuery(search.NewSearchQuery().
            SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
            SetLimit(0).
            GroupBy(search.NewGroupByField("group1", "field1").
                SubAggregation(search.NewMinAggregation("sub_agg1", "sub_field1")).
                SubAggregation(search.NewMaxAggregation("sub_agg2", "sub_field2")).
                SubGroupBy(search.NewGroupByRange("sub_group1", "sub_field3").
                    Range(search.NegInf, 3).
                    Range(3, 5).
                    Range(5, search.Inf))))

    searchResponse, err := client.Search(searchRequest)
    if err != nil {
        fmt.Printf("%#v", err)
        return
    }
    groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
    group, err := groupByResults.GroupByField("group1")
    if err != nil {
        fmt.Printf("%#v", err)
        return
    }

    for _, item := range group.Items { // 返されたグループをトラバースします。
        // 各グループの値と各グループ内の行数を表示します。
        fmt.Println("\tkey: ", item.Key, ", rowCount: ", item.RowCount)

        // sub_agg1 という名前の集計操作の結果を取得します。
        subAgg1, _ := item.SubAggregations.Min("sub_agg1")
        if subAgg1.HasValue() {
            fmt.Println("\t\tsub_agg1: ", subAgg1.Value)
        }

        // sub_agg2 という名前の集計操作の結果を取得します。
        subAgg2, _ := item.SubAggregations.Max("sub_agg2")
        if subAgg2.HasValue() {
            fmt.Println("\t\tsub_agg2: ", subAgg2.Value)
        }

        // sub_group1 という名前の集計操作の結果を取得します。
        subGroup, _ := item.SubGroupBys.GroupByRange("sub_group1")
        for _, item := range subGroup.Items {
            fmt.Println("\t\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount)
        }
    }
}

複数集計

複数の集計操作を実行できます。

説明

複数の複雑な集計操作を同時に実行すると、長時間を要する場合があります。

  • 例 1

    func MultipleAggregations(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
                SetLimit(0).
                Aggregation(search.NewAvgAggregation("agg1", "Col_Long")). // Col_Long フィールドの平均値を計算します。
                Aggregation(search.NewDistinctCountAggregation("agg2", "Col_Long")). // Col_Long フィールドの個別値の数を計算します。
                Aggregation(search.NewMaxAggregation("agg3", "Col_Long")). // Col_Long フィールドの最大値をクエリします。
                Aggregation(search.NewSumAggregation("agg4", "Col_Long")). // Col_Long フィールドの値の合計を計算します。
                Aggregation(search.NewCountAggregation("agg5", "Col_Long"))) // Col_Long フィールドを含む行数を計算します。
    
        // すべての列を返します。
        searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
            ReturnAll: true,
        })
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
    
        // 集計操作から取得された平均値を取得します。
        agg1, err := aggResults.Avg("agg1") // agg1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg1.HasValue() { // agg1 という名前の集計操作の結果に値が含まれているかどうかを確認します。
            fmt.Println("(avg) agg1: ", agg1.Value) // Col_Long フィールドの平均値を表示します。
        } else {
            fmt.Println("(avg) agg1: no value") // Col_Long フィールドに値が含まれていない行を表示します。
        }
    
        // 集計操作の結果から個別値の数を取得します。
        agg2, err := aggResults.DistinctCount("agg2") // agg2 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println("(distinct) agg2: ", agg2.Value) // Col_Long フィールドの個別値の数を表示します。
    
        // 集計操作から取得された最大値を表示します。
        agg3, err := aggResults.Max("agg3") // agg3 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg3.HasValue() {
            fmt.Println("(max) agg3: ", agg3.Value) // Col_Long フィールドの最大値を表示します。
        } else {
            fmt.Println("(max) agg3: no value") // Col_Long フィールドに値が含まれていない行を表示します。
        }
    
        // 集計操作の結果から合計を取得します。
        agg4, err := aggResults.Sum("agg4") // agg4 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println("(sum) agg4: ", agg4.Value) // Col_Long フィールドの合計を表示します。
    
        // 集計操作の結果から行数を取得します。
        agg5, err := aggResults.Count("agg5") // agg5 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println("(count) agg6: ", agg5.Value) // Col_Long フィールドの値の数を表示します。
    }
  • 例 2

    func MultipleAggregationsAndGroupBysSample(client *tablestore.TableStoreClient, tableName string, indexName string) {
        searchRequest := &tablestore.SearchRequest{}
    
        searchRequest.
            SetTableName(tableName). // データテーブルの名前を指定します。
            SetIndexName(indexName). // 多次元インデックスの名前を指定します。
            SetSearchQuery(search.NewSearchQuery().
                SetQuery(&search.MatchAllQuery{}). // すべての行を一致させます。
                SetLimit(0).
                Aggregation(search.NewAvgAggregation("agg1", "Col_Long")). // Col_Long フィールドの平均値を計算します。
                Aggregation(search.NewDistinctCountAggregation("agg2", "Col_Long")). // Col_Long フィールドの個別値の数を計算します。
                Aggregation(search.NewMaxAggregation("agg3", "Col_Long")). // Col_Long フィールドの最大値をクエリします。
                GroupBy(search.NewGroupByField("group1", "Col_Keyword"). // Col_Keyword フィールドに基づいて、フィールド値によって行をグループ化します。
                    GroupBySorters([]search.GroupBySorter{}). // 返されるグループのソート方法を指定します。
                    Size(2). // 最初の 2 つのグループのみが返されるように指定します。
                    SubAggregation(search.NewAvgAggregation("sub_agg1", "Col_Long")). // 各グループに対してサブ集計操作を実行します。
                    SubGroupBy(search.NewGroupByField("sub_group1", "Col_Keyword2"))). // 各グループに対してサブ集計操作を実行します。
                GroupBy(search.NewGroupByRange("group2", "Col_Long"). // Col_Long フィールドに基づいて、範囲によって行をグループ化します。
                    Range(search.NegInf, 3). // 最初のグループには、Col_Long フィールドの値が (NegInf, 3) の範囲内にある行が含まれます。
                    Range(3, 5). // 2 番目のグループには、Col_Long フィールドの値が [3, 5) の範囲内にある行が含まれます。
                    Range(5, search.Inf))) // 3 番目のグループには、Col_Long フィールドの値が [5, Inf) の範囲内にある行が含まれます。
    
        // すべての列を返します。
        searchResponse, err := client.Search(searchRequest)
        if err != nil {
            fmt.Printf("%#v", err)
            return
        }
    
        aggResults := searchResponse.AggregationResults // 集計結果を取得します。
        // 集計操作から取得された平均値を取得します。
        agg1, err := aggResults.Avg("agg1") // agg1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg1.HasValue() { // agg1 という名前の集計操作の結果に値が含まれているかどうかを確認します。
            fmt.Println("(avg) agg1: ", agg1.Value) // Col_Long フィールドの平均値を表示します。
        } else {
            fmt.Println("(avg) agg1: no value") // Col_Long フィールドに値が含まれていない行を表示します。
        }
    
        // 集計操作の結果から個別値の数を取得します。
        agg    agg2, err := aggResults.DistinctCount("agg2") // agg2 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println("(distinct) agg2: ", agg2.Value) // Col_Long フィールドの個別値の数を表示します。
    
        // 集計操作から取得された最大値を表示します。
        agg3, err := aggResults.Max("agg3") // agg3 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        if agg3.HasValue() {
            fmt.Println("(max) agg3: ", agg3.Value) // Col_Long フィールドの最大値を表示します。
        } else {
            fmt.Println("(max) agg3: no value") // Col_Long フィールドに値が含まれていない行を表示します。
        }
    
        groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
        // GroupByField 集計操作の結果を取得します。
        group1, err := groupByResults.GroupByField("group1") // group1 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println("group1: ")
        for _, item := range group1.Items { // 返されたすべてのグループをトラバースします。
            //item
            fmt.Println("\tkey: ", item.Key, ", rowCount: ", item.RowCount) // 各グループの行数を表示します。
    
            // サブ集計操作から取得された平均値を取得します。
            subAgg1, err := item.SubAggregations.Avg("sub_agg1") // sub_agg1 という名前のサブ集計操作の結果を取得します。
            if err != nil {
                panic(err)
            }
            if subAgg1.HasValue() { // sub_agg1 が Col_Long フィールドの平均値を取得した場合、HasValue() は true に設定されます。
                fmt.Println("\t\tsub_agg1: ", subAgg1.Value) // サブ集計操作から取得された Col_Long フィールドの平均値を表示します。
            }
    
            // GroupByField サブ集計操作の結果を取得します。
            subGroup1, err := item.SubGroupBys.GroupByField("sub_group1") // sub_group1 という名前のサブ集計操作の結果を取得します。
            if err != nil {
                panic(err)
            }
            fmt.Println("\t\tsub_group1")
            for _, subItem := range subGroup1.Items { // sub_group1 という名前のサブ集計操作の結果をトラバースします。
                fmt.Println("\t\t\tkey: ", subItem.Key, ", rowCount: ", subItem.RowCount) // sub_group1 という名前のサブ集計操作の結果から取得された各グループの行数を表示します。
                tablestore.Assert(subItem.SubAggregations.Empty(), "")
                tablestore.Assert(subItem.SubGroupBys.Empty(), "")
            }
        }
    
        // GroupByRange 集計操作の結果を取得します。
        group2, err := groupByResults.GroupByRange("group2") // group2 という名前の集計操作の結果を取得します。
        if err != nil {
            panic(err)
        }
        fmt.Println("group2: ")
        for _, item := range group2.Items { // 返されたすべてのグループをトラバースします。
            fmt.Println("\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount) // 各グループの行数を表示します。
        }
    }

付録:複数フィールドグループ化のさまざまな方法

複数のフィールドに基づいてクエリ結果をグループ化する場合、ネストモードで groupBy パラメータを使用するか、GroupByComposite パラメータを使用できます。 次の表は、ネストモードの groupBy パラメータと groupByComposite パラメータの違いについて説明しています。

機能

groupBy (ネスト)

groupByComposite

サイズ

2000

2000

フィールドの制限

最大 5 レベルがサポートされています。

最大 32 レベルがサポートされています。

ページング

サポートされていません

nextToken パラメータを使用してサポートされています

グループ内の行のソート規則

  • アルファベット順またはアルファベットの逆順

  • 行数で昇順または行数で降順

  • サブ集計結果から取得された値で昇順またはサブ集計結果から取得された値で降順

アルファベット順またはアルファベットの逆順

集計をサポート

はい

はい

互換性

Date タイプのフィールドの場合、クエリ結果は指定された形式で返されます。

DATE タイプのフィールドの場合、クエリ結果はタイムスタンプ文字列として返されます。