Klausa GROUP BY bekerja bersama fungsi agregat untuk mengelompokkan baris dari set hasil berdasarkan nilai yang sama dalam satu atau beberapa kolom. Untuk setiap kelompok, kueri mengembalikan satu baris ringkasan, sehingga mempermudah analisis data. Anda juga dapat menggunakan klausa GROUP BY bersama klausa ROLLUP, CUBE, dan GROUPING SETS guna memperluas kemampuan pengelompokan dan menyediakan opsi analisis yang lebih fleksibel.
Sintaksis
GROUP BY
Mengelompokkan baris dari set hasil.
SELECT
key1,
...
aggregate_function
GROUP BY
key,...
Parameter
-
key1: Kolom yang digunakan untuk mengelompokkan baris. Anda dapat mengelompokkan berdasarkan nama field log atau kolom hasil dari fungsi agregat. KlausaGROUP BYmendukung pengelompokan berdasarkan satu atau beberapa kolom. -
aggregate_function: Fungsi agregat yang diterapkan pada setiap kelompok, seperticount,min,max,avg, atausum.
GROUP BY ROLLUP
Klausa GROUP BY ROLLUP menghasilkan set hasil yang mencakup baris untuk setiap kelompok, serta baris subtotal dan total keseluruhan tambahan. Misalnya, GROUP BY ROLLUP (a, b) menghasilkan set hasil untuk grouping sets (a, b), (a, null), dan (null, null).
SELECT
key1,
...
aggregate_function
GROUP BY ROLLUP (key1,...)
Parameter
-
key1: Kolom yang digunakan untuk mengelompokkan baris. Anda dapat mengelompokkan berdasarkan nama field log atau kolom hasil dari fungsi agregat. KlausaGROUP BYmendukung pengelompokan berdasarkan satu atau beberapa kolom. -
aggregate_function: Fungsi agregat yang diterapkan pada setiap kelompok, seperticount,min,max,avg, atausum.
GROUP BY CUBE
Klausa GROUP BY CUBE menghasilkan set hasil yang mencakup semua kombinasi yang mungkin dari kolom yang ditentukan. Misalnya, GROUP BY CUBE (a, b) menghasilkan set hasil untuk grouping sets (a, b), (null, b), (a, null), dan (null, null).
SELECT
key1,
...
aggregate_function
GROUP BY CUBE (key1,...)
Parameter
-
key1: Kolom yang digunakan untuk mengelompokkan baris. Anda dapat mengelompokkan berdasarkan nama field log atau kolom hasil dari fungsi agregat. KlausaGROUP BYmendukung pengelompokan berdasarkan satu atau beberapa kolom. -
aggregate_function: Fungsi agregat yang diterapkan pada setiap kelompok, seperticount,min,max,avg, atausum.
GROUP BY GROUPING SETS
Klausa GROUP BY GROUPING SETS memungkinkan Anda menentukan beberapa skema pengelompokan berbeda dalam satu kueri. Misalnya, GROUP BY GROUPING SETS (a, b) setara dengan menggabungkan hasil dari GROUP BY a dan GROUP BY b. Set hasil mencakup grouping sets (a, null) dan (null, b).
SELECT
key1,
...
aggregate_function
GROUP BY GROUPING SETS (key1,...)
Parameter
-
key1: Kolom yang digunakan untuk mengelompokkan baris. Anda dapat mengelompokkan berdasarkan nama field log atau kolom hasil dari fungsi agregat. KlausaGROUP BYmendukung pengelompokan berdasarkan satu atau beberapa kolom. -
aggregate_function: Fungsi agregat yang diterapkan pada setiap kelompok, seperticount,min,max,avg, atausum.
Contoh
Saat menggunakan klausa GROUP BY dalam pernyataan kueri, daftar SELECT hanya boleh berisi:
-
Kolom yang ditentukan dalam klausa
GROUP BY. -
Fungsi agregat yang melakukan perhitungan pada suatu kolom, seperti
COUNT()atauSUM().
Anda tidak dapat memilih kolom yang tidak ada dalam klausa GROUP BY atau fungsi agregat. Hal ini karena setiap kelompok dapat memiliki beberapa nilai untuk kolom tersebut, sehingga nilainya dalam baris ringkasan menjadi ambigu.
* | SELECT status, request_time, COUNT(*) AS PV GROUP BY status
Kueri ini tidak valid karena kolom request_time tidak termasuk dalam klausa GROUP BY dan tidak diproses oleh fungsi agregat.
Untuk memperbaiki kueri, gunakan fungsi agregat:
* | SELECT status, arbitrary(request_time), COUNT(*) AS PV GROUP BY status
Dalam kueri ini, arbitrary(request_time) adalah fungsi agregat yang mengembalikan nilai arbitrer dari kolom request_time dalam setiap kelompok. Pendekatan ini memenuhi aturan sintaksis SQL dan memungkinkan Anda menyertakan kolom tersebut dalam kueri.
-
Contoh 1
Hitung jumlah page view (PV) untuk setiap kode status.
-
Pernyataan kueri
* | SELECT status, count(*) AS PV GROUP BY status -
Hasil kueri: Tabel dengan kolom status dan PV, yang menampilkan jumlah page view untuk setiap kode status HTTP.
-
-
Contoh 2
Hitung page view (PV) per jam untuk website Anda.
-
Pernyataan kueri
Field
__time__adalah field tereservasi di Simple Log Service yang merepresentasikan kolom waktu. Dalam kueri ini,timeadalah alias untukdate_trunc('hour', __time__). Untuk informasi selengkapnya tentang fungsidate_trunc, lihat fungsi date_trunc.* | SELECT count(*) AS PV, date_trunc('hour', __time__) AS time GROUP BY time ORDER BY time LIMIT 1000 -
Hasil kueri: Kueri mengembalikan set hasil dengan dua kolom, PV dan time. Data contoh mencakup PV sebesar 1.202, 10.159, dan 28.001, yang masing-masing sesuai dengan waktu 2021-08-10 00:00:00.000, 2021-08-10 01:00:00.000, dan 2021-08-10 02:00:00.000.
-
-
Contoh 3
Hitung PV dengan granularitas waktu 5 menit.
-
Pernyataan kueri
Fungsi
date_trunchanya dapat mengelompokkan data berdasarkan interval tetap. Untuk mengelompokkan data berdasarkan interval waktu kustom, gunakan operasi modulo. Misalnya,% 300menyelaraskan timestamp ke granularitas waktu 5 menit (300 detik).* | SELECT count(*) AS PV, __time__-__time__ % 300 AS time GROUP BY time LIMIT 1000 -
Hasil kueri: Kueri mengembalikan tiga catatan contoh: PV=143 untuk time=1628525100, PV=31 untuk time=1628526600, dan PV=44 untuk time=1628526900.
-
-
Contoh 4
Kelompokkan data berdasarkan metode permintaan dan status secara independen. Kueri ini menghitung total page view untuk setiap metode permintaan dan untuk setiap kode status.
-
Pernyataan kueri
* | SELECT request_method, status, count(*) AS PV GROUP BY GROUPING SETS (request_method, status) -
Hasil kueri: Saat hasil dikelompokkan berdasarkan
request_method, kolomstatusbernilai null. Nilai PV-nya adalah: GET (189), POST (47), PUT (39), DELETE (9), dan HEAD (1). Saat hasil dikelompokkan berdasarkanstatus, kolomrequest_methodbernilai null. Nilai PV-nya adalah: 200 (259), 201 (2), dan 202 (2).
-
-
Contoh 5
Kelompokkan data berdasarkan metode permintaan dan status. Kueri menghasilkan set hasil untuk semua kombinasi yang mungkin dari kolom-kolom ini, termasuk
(null, null),(request_method, null),(null, status), dan(request_method, status). Kemudian kueri menghitung page view untuk masing-masing kelompok tersebut.-
Pernyataan kueri
* | SELECT request_method, status, count(*) AS PV GROUP BY CUBE (request_method, status) -
Hasil kueri: Kueri mengembalikan 43 catatan dengan tiga kolom: request_method, status, dan PV. Dalam baris ringkasan yang dihasilkan oleh CUBE, nilai null menunjukkan subtotal untuk dimensi tersebut. Misalnya, baris dengan null/null memiliki PV sebesar 285 (total keseluruhan). Baris dengan GET/null memiliki PV 189, POST/null memiliki 47, PUT/null memiliki 39, DELETE/null memiliki 9, dan HEAD/null memiliki 1. Baris untuk subtotal status mencakup null/200 dengan PV 259, serta null/201 dan null/202 masing-masing dengan PV 2.
-
-
Contoh 6
Kelompokkan data berdasarkan metode permintaan dan status secara hierarkis. Kueri menghasilkan set hasil untuk grouping sets
(request_method, status),(request_method, null), dan(null, null), lalu menghitung page view untuk masing-masing kelompok tersebut.-
Pernyataan kueri
* | SELECT request_method, status, count(*) AS PV GROUP BY ROLLUP (request_method, status) -
Hasil kueri: Kueri mengembalikan 33 catatan dengan tiga kolom: request_method, status, dan PV. Fungsi ROLLUP menghasilkan baris ringkasan pada setiap tingkat pengelompokan. Nilai
nullmenunjukkan bahwa baris tersebut merepresentasikan subtotal. Misalnya, barisGET / null / 189menunjukkan bahwa total PV untuk metode GET di semua kode status adalah 189. Barisnull / null / 285menunjukkan bahwa total PV keseluruhan untuk semua metode dan kode status adalah 285.
-