Dalam agregasi dan analisis data multidimensi, jika Anda ingin mengagregasi Kolom a, mengagregasi Kolom b, serta mengagregasi Kolom a dan Kolom b secara bersamaan, Anda dapat menggunakan GROUPING SETS. Topik ini menjelaskan cara menggunakan GROUPING SETS untuk agregasi multidimensi.
Deskripsi
GROUPING SETS merupakan ekstensi dari klausa GROUP BY dalam pernyataan SELECT. Klausa GROUPING SETS memungkinkan Anda mengelompokkan hasil dengan berbagai cara tanpa perlu mengeksekusi beberapa pernyataan SELECT dan UNION ALL secara berurutan. Hal ini memungkinkan MaxCompute menghasilkan rencana eksekusi yang lebih efisien dengan performa lebih tinggi.
Tabel berikut menjelaskan sintaks yang terkait dengan GROUPING SETS.
|
Jenis |
Deskripsi |
|
|
Bentuk khusus dari
|
|
|
Bentuk khusus dari
|
|
|
|
|
|
|
|
|
Catatan
Jika Anda menggunakan Hive versi 2.3.0 atau yang lebih baru, kami merekomendasikan penggunaan fungsi ini di MaxCompute. Jika Anda menggunakan versi Hive sebelum 2.3.0, kami tidak merekomendasikan penggunaan fungsi ini di MaxCompute. |
Contoh
Contoh penggunaan GROUPING SETS:
-
Siapkan data.
create table requests lifecycle 20 as select * from values (1, 'windows', 'PC', 'Beijing'), (2, 'windows', 'PC', 'Shijiazhuang'), (3, 'linux', 'Phone', 'Beijing'), (4, 'windows', 'PC', 'Beijing'), (5, 'ios', 'Phone', 'Shijiazhuang'), (6, 'linux', 'PC', 'Beijing'), (7, 'windows', 'Phone', 'Shijiazhuang') as t(id, os, device, city); -
Gunakan salah satu metode berikut untuk mengelompokkan data:
-
Eksekusi beberapa pernyataan
SELECTuntuk mengelompokkan data.select NULL, NULL, NULL, count(*) from requests union all select os, device, NULL, count(*) from requests group by os, device union all select null, null, city, count(*) from requests group by city; -
Gunakan
GROUPING SETSuntuk mengelompokkan data.select os,device, city ,count(*) from requests group by grouping sets((os, device), (city), ());Hasil berikut dikembalikan:
+------------+------------+------------+------------+ | os | device | city | _c3 | +------------+------------+------------+------------+ | NULL | NULL | NULL | 7 | | NULL | NULL | Beijing | 4 | | NULL | NULL | Shijiazhuang | 3 | | ios | Phone | NULL | 1 | | linux | PC | NULL | 1 | | linux | Phone | NULL | 1 | | windows | PC | NULL | 3 | | windows | Phone | NULL | 1 | +------------+------------+------------+------------+
CatatanJika beberapa ekspresi tidak digunakan dalam GROUPING SETS, nilai NULL digunakan sebagai placeholder untuk ekspresi tersebut—misalnya, NULL pada kolom city di baris keempat hingga kedelapan. Dengan demikian, Anda dapat melakukan operasi pada set hasil.
-
Contoh Penggunaan CUBE atau ROLLUP
Contoh penggunaan CUBE atau ROLLUP berdasarkan sintaks GROUPING SETS:
-
Contoh 1: Gunakan
CUBEuntuk mencantumkan semua kombinasi yang mungkin dari kolomos,device, dancitysebagaigrouping sets.select os,device, city, count(*) from requests group by cube (os, device, city); -- Pernyataan di atas setara dengan pernyataan berikut: select os,device, city, count(*) from requests group by grouping sets ((os, device, city),(os, device),(os, city),(device,city),(os),(device),(city),());Hasil berikut dikembalikan:
+------------+------------+------------+------------+ | os | device | city | _c3 | +------------+------------+------------+------------+ | NULL | NULL | NULL | 7 | | NULL | NULL | Beijing | 4 | | NULL | NULL | Shijiazhuang | 3 | | NULL | PC | NULL | 4 | | NULL | PC | Beijing | 3 | | NULL | PC | Shijiazhuang | 1 | | NULL | Phone | NULL | 3 | | NULL | Phone | Beijing | 1 | | NULL | Phone | Shijiazhuang | 2 | | ios | NULL | NULL | 1 | | ios | NULL | Shijiazhuang | 1 | | ios | Phone | NULL | 1 | | ios | Phone | Shijiazhuang | 1 | | linux | NULL | NULL | 2 | | linux | NULL | Beijing | 2 | | linux | PC | NULL | 1 | | linux | PC | Beijing | 1 | | linux | Phone | NULL | 1 | | linux | Phone | Beijing | 1 | | windows | NULL | NULL | 4 | | windows | NULL | Beijing | 2 | | windows | NULL | Shijiazhuang | 2 | | windows | PC | NULL | 3 | | windows | PC | Beijing | 2 | | windows | PC | Shijiazhuang | 1 | | windows | Phone | NULL | 1 | | windows | Phone | Shijiazhuang | 1 | +------------+------------+------------+------------+ -
Contoh 2: Gunakan
CUBEuntuk mencantumkan semua kombinasi yang mungkin dari kolom(os, device)dan(device, city)sebagaigrouping sets.select os,device, city, count(*) from requests group by cube ((os, device), (device, city)); -- Pernyataan di atas setara dengan pernyataan berikut: select os,device, city, count(*) from requests group by grouping sets ((os, device, city),(os, device),(device,city),());Hasil berikut dikembalikan:
+------------+------------+------------+------------+ | os | device | city | _c3 | +------------+------------+------------+------------+ | NULL | NULL | NULL | 7 | | NULL | PC | Beijing | 3 | | NULL | PC | Shijiazhuang | 1 | | NULL | Phone | Beijing | 1 | | NULL | Phone | Shijiazhuang | 2 | | ios | Phone | NULL | 1 | | ios | Phone | Shijiazhuang | 1 | | linux | PC | NULL | 1 | | linux | PC | Beijing | 1 | | linux | Phone | NULL | 1 | | linux | Phone | Beijing | 1 | | windows | PC | NULL | 3 | | windows | PC | Beijing | 2 | | windows | PC | Shijiazhuang | 1 | | windows | Phone | NULL | 1 | | windows | Phone | Shijiazhuang | 1 | +------------+------------+------------+------------+ -
Contoh 3: Gunakan
ROLLUPuntuk mengagregasi kolomos,device, dancitysecara hierarkis guna menghasilkan beberapagrouping sets.select os,device, city, count(*) from requests group by rollup (os, device, city); -- Pernyataan di atas setara dengan pernyataan berikut: select os,device, city, count(*) from requests group by grouping sets ((os, device, city),(os, device),(os),());Hasil berikut dikembalikan:
+------------+------------+------------+------------+ | os | device | city | _c3 | +------------+------------+------------+------------+ | NULL | NULL | NULL | 7 | | ios | NULL | NULL | 1 | | ios | Phone | NULL | 1 | | ios | Phone | Shijiazhuang | 1 | | linux | NULL | NULL | 2 | | linux | PC | NULL | 1 | | linux | PC | Beijing | 1 | | linux | Phone | NULL | 1 | | linux | Phone | Beijing | 1 | | windows | NULL | NULL | 4 | | windows | PC | NULL | 3 | | windows | PC | Beijing | 2 | | windows | PC | Shijiazhuang | 1 | | windows | Phone | NULL | 1 | | windows | Phone | Shijiazhuang | 1 | +------------+------------+------------+------------+ -
Contoh 4: Gunakan
ROLLUPuntuk mengagregasios,(os,device), dancitysecara hierarkis guna menghasilkan beberapagrouping sets.select os,device, city, count(*) from requests group by rollup (os, (os,device), city); -- Pernyataan di atas setara dengan pernyataan berikut: select os,device, city, count(*) from requests group by grouping sets ((os, device, city),(os, device),(os),());Hasil berikut dikembalikan:
+------------+------------+------------+------------+ | os | device | city | _c3 | +------------+------------+------------+------------+ | NULL | NULL | NULL | 7 | | ios | NULL | NULL | 1 | | ios | Phone | NULL | 1 | | ios | Phone | Shijiazhuang | 1 | | linux | NULL | NULL | 2 | | linux | PC | NULL | 1 | | linux | PC | Beijing | 1 | | linux | Phone | NULL | 1 | | linux | Phone | Beijing | 1 | | windows | NULL | NULL | 4 | | windows | PC | NULL | 3 | | windows | PC | Beijing | 2 | | windows | PC | Shijiazhuang | 1 | | windows | Phone | NULL | 1 | | windows | Phone | Shijiazhuang | 1 | +------------+------------+------------+------------+ -
Contoh 5: Gunakan
GROUP BY,CUBE, danGROUPING SETSuntuk menghasilkan beberapagrouping sets.select os,device, city, count(*) from requests group by os, cube(os,device), grouping sets(city); -- Pernyataan di atas setara dengan pernyataan berikut: select os,device, city, count(*) from requests group by grouping sets((os,device,city),(os,city),(os,device,city));Hasil berikut dikembalikan:
+------------+------------+------------+------------+ | os | device | city | _c3 | +------------+------------+------------+------------+ | ios | NULL | Shijiazhuang | 1 | | ios | Phone | Shijiazhuang | 1 | | linux | NULL | Beijing | 2 | | linux | PC | Beijing | 1 | | linux | Phone | Beijing | 1 | | windows | NULL | Beijing | 2 | | windows | NULL | Shijiazhuang | 2 | | windows | PC | Beijing | 2 | | windows | PC | Shijiazhuang | 1 | | windows | Phone | Shijiazhuang | 1 | +------------+------------+------------+------------+
Contoh Penggunaan GROUPING dan GROUPING_ID
Pernyataan contoh:
select a,b,c,count(*),
grouping(a) ga, grouping(b) gb, grouping(c) gc, grouping_id(a,b,c) groupingid
from values (1,2,3) as t(a,b,c)
group by cube(a,b,c);
Hasil berikut dikembalikan:
+------------+------------+------------+------------+------------+------------+------------+------------+
| a | b | c | _c3 | ga | gb | gc | groupingid |
+------------+------------+------------+------------+------------+------------+------------+------------+
| NULL | NULL | NULL | 1 | 1 | 1 | 1 | 7 |
| NULL | NULL | 3 | 1 | 1 | 1 | 0 | 6 |
| NULL | 2 | NULL | 1 | 1 | 0 | 1 | 5 |
| NULL | 2 | 3 | 1 | 1 | 0 | 0 | 4 |
| 1 | NULL | NULL | 1 | 0 | 1 | 1 | 3 |
| 1 | NULL | 3 | 1 | 0 | 1 | 0 | 2 |
| 1 | 2 | NULL | 1 | 0 | 0 | 1 | 1 |
| 1 | 2 | 3 | 1 | 0 | 0 | 0 | 0 |
+------------+------------+------------+------------+------------+------------+------------+------------+
Secara default, kolom yang tidak ditentukan dalam GROUP BY diisi dengan NULL. Anda dapat menggunakan GROUPING untuk menentukan nilai yang Anda perlukan. Contoh pernyataan berdasarkan sintaks GROUPING SETS:
select
if(grouping(os) == 0, os, 'ALL') as os,
if(grouping(device) == 0, device, 'ALL') as device,
if(grouping(city) == 0, city, 'ALL') as city,
count(*) as count
from requests
group by os, device, city grouping sets((os, device), (city), ());
Hasil berikut dikembalikan:
+------------+------------+------------+------------+
| os | device | city | count |
+------------+------------+------------+------------+
| ALL | ALL | ALL | 7 |
| ALL | ALL | Beijing | 4 |
| ALL | ALL | Shijiazhuang | 3 |
| ios | Phone | ALL | 1 |
| linux | PC | ALL | 1 |
| linux | Phone | ALL | 1 |
| windows | PC | ALL | 3 |
| windows | Phone | ALL | 1 |
+------------+------------+------------+------------+
Contoh Penggunaan GROUPING__ID
Contoh penggunaan GROUPING__ID tanpa parameter yang ditentukan:
set odps.sql.hive.compatible=true;
select
a, b, c, count(*), grouping__id
from values (1,2,3) as t(a,b,c)
group by a, b, c grouping sets ((a,b,c), (a));
-- Pernyataan di atas setara dengan pernyataan berikut:
select
a, b, c, count(*), grouping_id(a,b,c)
from values (1,2,3) as t(a,b,c)
group by a, b, c grouping sets ((a,b,c), (a));
Hasil berikut dikembalikan:
+------------+------------+------------+------------+------------+
| a | b | c | _c3 | _c4 |
+------------+------------+------------+------------+------------+
| 1 | NULL | NULL | 1 | 3 |
| 1 | 2 | 3 | 1 | 0 |
+------------+------------+------------+------------+------------+