All Products
Search
Document Center

Tablestore:Agregasi

Last Updated:Oct 09, 2026

Topik ini menjelaskan cara melakukan operasi agregasi untuk analisis data. Operasi agregasi dapat menghitung nilai minimum, maksimum, jumlah, rata-rata, jumlah baris, jumlah baris unik (distinct count), dan persentil. Hasilnya dapat dikelompokkan berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau tanggal, dengan opsi menjalankan kueri bersarang (nested queries) untuk menganalisis baris dari setiap kelompok. Beberapa operasi agregasi juga dapat digabungkan untuk kueri yang lebih kompleks.

Prosedur

Gambar berikut menunjukkan prosedur agregasi lengkap.

fig_agg_pro

Server mengkueri data yang memenuhi kondisi kueri dan melakukan agregasi pada data tersebut sesuai permintaan. Oleh karena itu, permintaan yang memerlukan agregasi lebih kompleks untuk diproses dibandingkan permintaan tanpa agregasi.

Fitur

Agregasi mendukung berbagai fitur yang mirip dengan fungsi SQL, seperti fungsi MIN() untuk mendapatkan nilai minimum, fungsi MAX() untuk mendapatkan nilai maksimum, fungsi SUM() untuk mendapatkan jumlah total, fungsi AVG() untuk mendapatkan nilai rata-rata, fungsi COUNT() untuk mendapatkan jumlah baris, fungsi COUNT(DISTINCT) untuk mendapatkan jumlah baris unik, fungsi ANY_VALUE() untuk mengkueri baris hasil operasi agregasi di setiap kelompok, serta fungsi GROUP BY untuk mengelompokkan hasil kueri. Anda juga dapat melakukan operasi agregasi untuk mendapatkan statistik persentil, mengelompokkan hasil berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau histogram tanggal, mengelompokkan hasil berdasarkan beberapa bidang, serta menjalankan kueri bersarang. Tabel berikut menjelaskan fitur-fitur tersebut.

Fitur

Deskripsi

Nilai minimum

Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum suatu bidang. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL MIN.

Nilai maksimum

Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum suatu bidang. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL MAX.

Jumlah

Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL SUM.

Nilai rata-rata

Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL AVG.

Jumlah baris

Metode agregasi yang dapat digunakan untuk mengembalikan jumlah total nilai untuk suatu bidang atau jumlah total baris dalam indeks pencarian. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL COUNT.

Jumlah baris unik

Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai unik untuk suatu bidang. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL COUNT(DISTINCT).

Statistik persentil

Nilai persentil menunjukkan posisi relatif suatu nilai dalam set data. Misalnya, saat Anda mengumpulkan statistik tentang waktu respons setiap permintaan selama operasi dan pemeliharaan (O&M) rutin sistem Anda, Anda perlu menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99.

Kelompokkan berdasarkan nilai bidang

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai-nilai yang sama dikelompokkan bersama. Nilai identik untuk setiap kelompok dan jumlah nilai identik dalam setiap kelompok dikembalikan.

Nesting dalam GroupBy

GroupBy mendukung nesting. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy.

Kelompokkan berdasarkan beberapa bidang

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging.

Kelompokkan berdasarkan rentang

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai bidang yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan.

Kelompokkan berdasarkan lokasi geografis

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil kueri dalam jarak yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan.

Kelompokkan berdasarkan filter

Metode agregasi yang dapat digunakan untuk memfilter hasil kueri dan mengelompokkannya untuk mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan sesuai urutan filter yang ditentukan.

Kueri berdasarkan histogram

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap kelompok dan jumlah nilai dalam setiap kelompok dikembalikan.

Kueri berdasarkan histogram tanggal

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval tanggal tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap kelompok dan jumlah nilai dalam setiap kelompok dikembalikan.

Kueri baris yang diperoleh dari hasil operasi agregasi di setiap kelompok

Setelah Anda mengelompokkan hasil kueri, Anda dapat mengkueri baris dalam setiap kelompok. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi ANY_VALUE(field) di MySQL.

Agregasi ganda

Anda dapat melakukan beberapa operasi agregasi sekaligus.

Catatan

Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu pemrosesan yang lama mungkin diperlukan.

Prasyarat

Nilai minimum

Metode agregasi yang mengembalikan nilai minimum suatu bidang. Metode ini berfungsi serupa dengan fungsi SQL MIN.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Nilai minimum. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void MinAggregation(OTSClient otsClient)
    {
        MinAggregation minAggregation = new MinAggregation();
        minAggregation.AggName = "Min_Agg";
        minAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                minAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMinAggregationResult("Min_Agg")));
    }

Nilai maksimum

Metode agregasi yang mengembalikan nilai maksimum suatu bidang. Metode ini berfungsi serupa dengan fungsi SQL MAX.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Nilai maksimum. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void MaxAggregation(OTSClient otsClient)
    {
        MaxAggregation maxAggregation = new MaxAggregation();
        maxAggregation.AggName = "Max_Agg";
        maxAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                maxAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMaxAggregationResult("Max_Agg")));
    }

Jumlah

Metode agregasi yang mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini berfungsi serupa dengan fungsi SQL SUM.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Jumlah. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void SumAggregation(OTSClient otsClient)
    {
        SumAggregation sumAggregation = new SumAggregation();
        sumAggregation.AggName = "Sum_Agg";
        sumAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                sumAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsSumAggregationResult("Sum_Agg")));
    }

Nilai rata-rata

Metode agregasi yang mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini berfungsi serupa dengan fungsi SQL AVG.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Nilai rata-rata. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void AvgAggregation(OTSClient otsClient)
    {
        AvgAggregation avgAggregation = new AvgAggregation();
        avgAggregation.AggName = "Avg_Agg";
        avgAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                avgAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsAvgAggregationResult("Avg_Agg")));
    }

Jumlah

Metode agregasi yang mengembalikan jumlah total nilai untuk bidang tertentu atau jumlah total baris dalam indeks pencarian. Metode ini berfungsi serupa dengan fungsi SQL COUNT.

Catatan

Anda dapat menggunakan metode berikut untuk mengkueri jumlah total baris dalam indeks pencarian atau jumlah total baris yang memenuhi kondisi kueri:

  • Gunakan fitur count agregasi dan tentukan count(*) dalam permintaan.

  • Gunakan fitur kueri untuk mendapatkan jumlah baris yang memenuhi kondisi kueri. Atur setGetTotalCount ke true dalam kueri. Gunakan MatchAllQuery untuk mendapatkan jumlah total baris dalam indeks pencarian.

Anda dapat menggunakan nama kolom sebagai nilai ekspresi count untuk mengkueri jumlah baris yang berisi kolom tersebut dalam indeks pencarian. Metode ini cocok untuk skenario yang melibatkan kolom sparse.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, BOOLEAN, KEYWORD, GEO_POINT, dan DATE yang didukung.

  • Contoh

    /// <summary>
    /// Jumlah baris. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void CountAggregation(OTSClient otsClient)
    {
        CountAggregation countAggregation = new CountAggregation();
        countAggregation.AggName = "Count_Agg";
        countAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                countAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsCountAggregationResult("Count_Agg")));
    }

Jumlah baris unik

Metode agregasi yang mengembalikan jumlah nilai unik untuk suatu bidang. Metode ini berfungsi serupa dengan fungsi SQL COUNT(DISTINCT).

Catatan

Jumlah nilai unik merupakan angka perkiraan.

  • Jika jumlah total baris sebelum menggunakan fitur jumlah baris unik kurang dari 10.000, hasil yang dihitung mendekati nilai eksak.

  • Jika jumlah total baris sebelum menggunakan fitur jumlah baris unik lebih besar atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, BOOLEAN, KEYWORD, GEO_POINT, dan DATE yang didukung.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Jumlah baris unik. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void DistinctCountAggregation(OTSClient otsClient)
    {
        DistinctCountAggregation distinctCountAggregation = new DistinctCountAggregation();
        distinctCountAggregation.AggName = "DistinctCount_Agg";
        distinctCountAggregation.FieldName = "pk1";
    
        TermsQuery termsQuery = new TermsQuery();
        termsQuery.FieldName = "pk0";
        termsQuery.Terms = new List<ColumnValue>
        {
            new ColumnValue("Sample"),
            new ColumnValue("SearchIndex")
        };
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = termsQuery,
            AggregationList = new List<IAggregation>
            {
                distinctCountAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsDistinctCountAggregationResult("DistinctCount_Agg")));
    }

Statistik persentil

Nilai persentil menunjukkan posisi relatif suatu nilai dalam set data. Misalnya, saat Anda mengumpulkan statistik tentang waktu respons setiap permintaan selama operasi dan pemeliharaan (O&M) rutin sistem Anda, Anda perlu menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99.

Catatan

Persentil dihitung secara perkiraan. Persentil yang berada di ujung biasanya lebih akurat. Misalnya, P1 dan P99 biasanya lebih akurat daripada P50.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung.

    Percentiles

    Persentil seperti p50, p90, dan p99. Anda dapat menentukan satu atau beberapa persentil.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Statistik persentil. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void PercentilesAggregation(OTSClient otsClient)
    {
        PercentilesAggregation percentilesAggregation = new PercentilesAggregation();
        percentilesAggregation.AggName = "Percentiles_Agg";
        percentilesAggregation.FieldName = "pk1";
        percentilesAggregation.Missing = new ColumnValue(10);
        percentilesAggregation.Percentiles = new List<double> { 10.0, 30.0, 60.0, 90.0, 100.0 };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.AggregationList = new List<IAggregation> { percentilesAggregation };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Kelompokkan berdasarkan nilai bidang

Metode agregasi yang mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai-nilai yang sama dikelompokkan bersama, dan dikembalikan nilai identik setiap kelompok beserta jumlah kemunculannya.

Catatan

Jumlah yang dihitung mungkin berbeda dari jumlah aktual jika jumlah nilai dalam suatu kelompok sangat besar.

  • Parameter

    Parameter

    Deskripsi

    GroupByName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, BOOLEAN, KEYWORD, dan DATE yang didukung.

    Size

    Jumlah kelompok yang ingin dikembalikan. Nilai default: 10. Nilai maksimum: 2000. Jika jumlah kelompok melebihi 2.000, hanya 2.000 kelompok pertama yang dikembalikan.

    GroupBySorters

    Aturan pengurutan untuk kelompok. Secara default, kelompok diurutkan berdasarkan jumlah item dalam kelompok secara menurun. Jika Anda mengonfigurasi beberapa aturan pengurutan, kelompok diurutkan berdasarkan urutan aturan yang dikonfigurasi. Parameter yang didukung:

    • Urutkan berdasarkan nilai secara alfabetis.

    • Urutkan berdasarkan nilai secara alfabetis terbalik.

    • Urutkan berdasarkan jumlah baris secara menaik.

    • Urutkan berdasarkan jumlah baris secara menurun.

    • Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menaik.

    • Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menurun.

    SubAggregation dan SubGroupBy

    Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.

    • Skenario

      Kueri jumlah produk dalam setiap kategori, serta harga produk maksimum dan minimum di setiap kategori.

    • Metode

      Kelompokkan hasil kueri berdasarkan kategori produk untuk mendapatkan jumlah produk dalam setiap kategori. Kemudian, lakukan dua operasi sub-agregasi untuk mendapatkan harga produk maksimum dan minimum di setiap kategori.

    • Contoh hasil

      • Buah-buahan: 5. Harga maksimum USD 2. Harga minimum USD 0,5.

      • Perlengkapan mandi: 10. Harga maksimum USD 13. Harga minimum USD 0,1.

      • Perangkat elektronik: 3. Harga maksimum USD 1.160. Harga minimum USD 310.

      • Produk lainnya: 15. Harga maksimum USD 130. Harga minimum USD 11.

  • Contoh

    /// <summary>
    /// Kelompokkan berdasarkan nilai bidang. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByField(OTSClient otsClient)
    {
        GroupByField groupByField = new GroupByField
        {
            GroupByName = "GroupBy_Field",
            FieldName = "pk0",
            GroupBySorters = new List<GroupBySorter>{
                new GroupBySorter()
                {
                    RowCountSort = new RowCountSort{ Order = SortOrder.DESC }
                },
                new GroupBySorter()
                {
                    GroupKeySort = new GroupKeySort{ Order = SortOrder.DESC }
                }
            }
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByField };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Kelompokkan berdasarkan rentang

Metode agregasi yang mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai bidang yang berada dalam rentang tertentu dikelompokkan bersama, dan dikembalikan jumlah nilai dalam setiap rentang.

  • Parameter

    Parameter

    Deskripsi

    GroupByName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung.

    Range[double_from, double_to)

    Rentang nilai untuk pengelompokan.

    Rentang nilai dapat dimulai dari double.MinValue dan diakhiri dengan double.MaxValue.

    SubAggregation dan SubGroupBy

    Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.

    Misalnya, setelah Anda mengelompokkan hasil kueri berdasarkan volume penjualan dan provinsi, Anda dapat memperoleh provinsi yang memiliki proporsi volume penjualan terbesar dalam rentang tertentu. Anda harus menentukan nilai GroupByField dalam GroupByRange untuk melakukan kueri ini.

  • Contoh

    /// <summary>
    /// Kueri berdasarkan rentang. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByRange(OTSClient otsClient)
    {
        GroupByRange groupByRange = new GroupByRange();
        groupByRange.GroupByName = "GroupBy_Range";
        groupByRange.FieldName = "pk1";
        groupByRange.Ranges = new List<Range>
        {
            new Range(double.MinValue, 5.0),
            new Range(5.0, 50.0),
            new Range(50.0, 100.0),
            new Range(100.0, double.MaxValue)
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByRange };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Kelompokkan berdasarkan lokasi geografis

Metode agregasi yang mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil kueri dalam jarak tertentu dikelompokkan bersama, dan dikembalikan jumlah nilai dalam setiap rentang jarak.

  • Parameter

    Parameter

    Deskripsi

    GroupByName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk operasi agregasi. Hanya tipe GEOPOINT yang didukung.

    Origin(double latitude, double longitude)

    Garis bujur dan lintang titik pusat.

    latitude menentukan lintang titik pusat. longitude menentukan garis bujur titik pusat.

    Range[double_from, double_to)

    Rentang jarak yang digunakan untuk pengelompokan. Satuan: meter.

    Rentang nilai dapat dimulai dari double.MinValue dan diakhiri dengan double.MaxValue.

    SubAggregation dan SubGroupBy

    Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.

  • Contoh

    /// <summary>
    /// Kelompokkan berdasarkan lokasi geografis. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByGeoDistance(OTSClient otsClient)
    {
        GroupByGeoDistance groupByGeoDistance = new GroupByGeoDistance
        {
            GroupByName = "GroupBy_GeoDistance",
            FieldName = "geo_col",
            Origin = new GeoPoint(0, 0),
            Ranges = new List<Range>
            {
                new Range(double.MinValue , 1000.0),
                new Range(1000.0, 5000.0),
                new Range(5000.0, double.MaxValue)
            }
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByGeoDistance };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Kelompokkan berdasarkan filter

Metode agregasi yang memfilter hasil kueri dan mengelompokkannya untuk mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan sesuai urutan filter yang ditentukan.

  • Parameter

    Parameter

    Deskripsi

    GroupByName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    Filters

    Filter yang dapat digunakan untuk kueri. Hasil dikembalikan sesuai urutan filter yang ditentukan.

    SubAggregation dan SubGroupBy

    Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.

  • Contoh

    /// <summary>
    /// Kelompokkan berdasarkan filter. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByFilter(OTSClient otsClient)
    {
        GroupByFilter groupByFilter = new GroupByFilter
        {
            GroupByName = "GroupBy_Filter",
            Filters = new List<IQuery>
            {
                new RangeQuery
                {
                    FieldName = "pk1",
                    From = new ColumnValue(0.0),
                    To = new ColumnValue(5.0)
                },
            }
        };
    
        TermsQuery termsQuery = new TermsQuery();
        termsQuery.FieldName = "pk0";
        termsQuery.Terms = new List<ColumnValue>
        {
            new ColumnValue("Tablestore SearchIndex"),
            new ColumnValue("SearchIndex")
        };
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByFilter };
        searchQuery.Query = termsQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Kueri berdasarkan histogram

Metode agregasi yang mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama, dan dikembalikan rentang nilai setiap kelompok beserta jumlah nilainya.

  • Parameter

    Parameter

    Deskripsi

    GroupByName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    FieldName

    Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung.

    Interval

    Interval data yang digunakan untuk mendapatkan hasil agregasi.

    FieldRange[min,max]

    Rentang yang digunakan bersama parameter interval untuk membatasi jumlah kelompok. Nilai yang dihitung menggunakan rumus (FieldRange.max-FieldRange.min)/interval tidak boleh melebihi 2.000.

    MinDocCount

    Jumlah minimum baris. Jika jumlah baris dalam suatu kelompok kurang dari jumlah minimum baris, hasil agregasi untuk kelompok tersebut tidak dikembalikan.

    Missing

    Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.

    • Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.

    • Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /// <summary>
    /// Kueri berdasarkan histogram. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void HistogramAggregation(OTSClient otsClient)
    {
        GroupByHistogram groupByHistogram = new GroupByHistogram();
        groupByHistogram.GroupByName = "GroupBy_Histogram";
        groupByHistogram.FieldName = "pk1";
        groupByHistogram.Interval = new ColumnValue(5);
        groupByHistogram.Missing = new ColumnValue(100);
        groupByHistogram.FieldRange = new FieldRange(new ColumnValue(0), new ColumnValue(1000));
    
        MatchAllQuery matchAllQuery = new MatchAllQuery(); ;
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
        searchQuery.GroupByList = new List<IGroupBy>
        {
            groupByHistogram
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        foreach (GroupByHistogramResultItem item in searchResponse.GroupByResults.GetAsGroupByHistogramResult("GroupBy_Histogram").GroupByHistogramResultItems)
        {
            Console.WriteLine(JsonConvert.SerializeObject(item));
        }
    }

Kueri baris yang diperoleh dari hasil operasi agregasi di setiap kelompok

Setelah mengelompokkan hasil kueri, Anda dapat mengkueri baris dalam setiap kelompok. Metode ini berfungsi serupa dengan fungsi ANY_VALUE(field) di MySQL.

Catatan

Saat mengkueri baris hasil operasi agregasi di setiap kelompok, hasil yang dikembalikan hanya berisi informasi kunci primer jika indeks pencarian berisi bidang Nested, Geopoint, atau Array. Untuk mendapatkan bidang yang diperlukan, Anda harus mengkueri tabel data.

  • Parameter

    Parameter

    Deskripsi

    AggName

    Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.

    Limit

    Jumlah maksimum baris yang dapat dikembalikan untuk setiap kelompok. Secara default, hanya satu baris data yang dikembalikan.

    Sort

    Metode pengurutan yang digunakan untuk mengurutkan data dalam kelompok.

    ColumnsToGet

    Bidang yang ingin dikembalikan. Hanya bidang dalam indeks pencarian yang didukung. Bidang ARRAY, DATE, GEOPOINT, dan NESTED tidak didukung.

    Nilai parameter ini sama dengan nilai columnsToGet dalam SearchRequest. Anda hanya perlu menentukan columnsToGet dalam SearchRequest.

  • Contoh

    /// <summary>
    /// Kueri baris yang diperoleh dari hasil operasi agregasi di setiap kelompok. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void TopRowsAggregation(OTSClient otsClient)
    {
        GroupByField groupByField = new GroupByField();
        groupByField.GroupByName = "GroupBy_Field";
        groupByField.FieldName = "pk0";
        groupByField.SubAggregations = new List<IAggregation>
        {
            new TopRowsAggregation
            {
                AggName = "TopRows_Agg",
                Sort = new Sort(new List<ISorter> { new FieldSort("pk1", SortOrder.DESC) }),
                Limit = 2
            }
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery(); ;
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
        searchQuery.GroupByList = new List<IGroupBy>
        {
            groupByField
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("GroupBy_Field").GroupByFieldResultItems)
        {
            foreach (Row row in item.SubAggregationResults.GetAsTopRowsAggregationResult("TopRows_Agg").Rows)
            {
                Console.WriteLine(JsonConvert.SerializeObject(row));
            }
        }
    }

Nesting

Anda dapat menggunakan nesting untuk melakukan operasi sub-agregasi dalam suatu kelompok. Misalnya, Anda dapat melakukan operasi agregasi bersarang hingga dua tingkat.

  • GroupBy + SubGroupBy: Item dikelompokkan berdasarkan provinsi dan kota untuk mendapatkan data setiap kota di setiap provinsi.

  • GroupBy + SubAggregation: Item dikelompokkan berdasarkan provinsi dan nilai maksimum suatu metrik dihitung untuk mendapatkan nilai maksimum metrik tersebut di setiap provinsi.

Catatan

Untuk menyeimbangkan kinerja dan kompleksitas, hanya jumlah lapisan nesting tertentu yang diizinkan. Untuk informasi selengkapnya, lihat Batas indeks pencarian.

/// <summary>
/// Nesting. 
/// </summary>
/// <param name="otsClient"></param>
public static void SubGroupBy(OTSClient otsClient)
{
    GroupByField groupByField = new GroupByField();
    groupByField.GroupByName = "Field_GroupBy";
    groupByField.FieldName = "pk0";
    groupByField.SubGroupBys = new List<IGroupBy>
    {
        new GroupByRange
        {
            GroupByName = "Range_GroupBy",
            FieldName = "pk1",
            Ranges = new List<Range>
            {
                new Range(double.MinValue, 5),
                new Range(5,100),
                new Range(100, double.MaxValue)
            }

        }
    };

    MatchAllQuery matchAllQuery = new MatchAllQuery();

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.GroupByList = new List<IGroupBy>
    {
        groupByField
    };
    searchQuery.GetTotalCount = true;
    searchQuery.Limit = 0;
    searchQuery.Query = matchAllQuery;

    SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);

    SearchResponse searchResponse = otsClient.Search(searchRequest);

    foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("Field_GroupBy").GroupByFieldResultItems)
    {
        Console.WriteLine(JsonConvert.SerializeObject(item.SubGroupByResults.GetAsGroupByRangeResult("Range_GroupBy")));
    }
}

Agregasi ganda

Anda dapat melakukan beberapa operasi agregasi sekaligus.

Catatan

Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu pemrosesan yang lama mungkin diperlukan.

/// <summary>
/// Agregasi ganda. 
/// </summary>
/// <param name="otsClient"></param>
public static void MultipleAggregation(OTSClient otsClient)
{
    MaxAggregation maxAggregation = new MaxAggregation();
    maxAggregation.AggName = "Max_Agg";
    maxAggregation.FieldName = "pk1";

    MinAggregation minAggregation = new MinAggregation();
    minAggregation.AggName = "Min_Agg";
    minAggregation.FieldName = "pk1";

    SumAggregation sumAggregation = new SumAggregation();
    sumAggregation.AggName = "Sum_Agg";
    sumAggregation.FieldName = "pk1";

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.Limit = 0;
    searchQuery.Query = new MatchAllQuery();
    searchQuery.AggregationList = new List<IAggregation>
    {
        maxAggregation,
        minAggregation,
        sumAggregation
    };

    SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);

    SearchResponse searchResponse = otsClient.Search(searchRequest);

    Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}