Mirip dengan layanan basis data relasional lainnya, PolarDB for PostgreSQL (Compatible with Oracle) mendukung fungsi agregat. Fungsi ini menghitung satu hasil dari beberapa baris input. Contohnya, Anda dapat menggunakan fungsi agregat untuk menghitung COUNT, SUM, AVG (rata-rata), MAX (maksimum), dan MIN (minimum) pada sekumpulan baris.
Contoh
Contoh berikut didasarkan pada basis data sampel yang dijelaskan dalam Sebuah basis data sampel.
Jalankan pernyataan berikut untuk menemukan gaji tertinggi dan terendah:
SELECT MAX(sal) highest_salary, MIN(sal) lowest_salary FROM emp;Hasil berikut dikembalikan:
highest_salary | lowest_salary ----------------+--------------- 5000 | 800 (1 row)Jalankan pernyataan berikut untuk menemukan karyawan dengan gaji tertinggi:
SELECT ename FROM emp WHERE sal = MAX(sal);Hasil berikut dikembalikan:
ERROR: aggregate functions are not allowed in WHEREFungsi agregat MAX tidak dapat digunakan dalam klausa WHERE karena klausa tersebut menentukan baris mana yang akan diagregasi dan harus dievaluasi sebelum fungsi agregat dihitung. Namun, Anda dapat menggunakan subquery untuk menyusun ulang query guna mendapatkan hasil yang diharapkan:
SELECT ename FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);Hasil berikut dikembalikan:
ename ------- KING (1 row)Subquery adalah komputasi independen yang memperoleh hasil secara terpisah dari query luar.
Gunakan klausa GROUP BY. Sebagai contoh, jalankan pernyataan berikut untuk menanyakan gaji tertinggi di setiap departemen:
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;Hasil berikut dikembalikan:
deptno | max --------+--------- 10 | 5000.00 20 | 3000.00 30 | 2850.00 (3 rows)Gunakan bersama dengan klausa WHERE dan HAVING.
Gunakan klausa HAVING untuk memfilter baris-baris yang dikelompokkan dan menghasilkan satu baris keluaran per departemen. Setiap hasil agregat dihitung berdasarkan baris yang cocok dengan departemen tersebut.
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;Hasil berikut dikembalikan. Hasil yang sama hanya ditampilkan untuk departemen-departemen dengan rata-rata gaji lebih dari 2000.
Gunakan klausa WHERE untuk menanyakan karyawan dengan bayaran tertinggi yang merupakan analis di setiap departemen.
SELECT deptno, MAX(sal) FROM emp WHERE job = 'ANALYST' GROUP BY deptno HAVING AVG(sal) > 2000;Hasil berikut dikembalikan:
deptno | max --------+--------- 20 | 3000.00 (1 row)Perbedaan halus terdapat antara klausa WHERE dan HAVING. Klausa WHERE menyaring baris sebelum pengelompokan dan penerapan fungsi agregat. Setelah baris dikelompokkan dan fungsi agregat dihitung untuk setiap grup, klausa HAVING menerapkan filter pada hasil.
Oleh karena itu, dalam contoh sebelumnya, hanya karyawan yang merupakan analis yang dipertimbangkan. Dari subset ini, karyawan dikelompokkan berdasarkan departemen dan hanya grup-grup di mana rata-rata gaji analis lebih dari 2000 yang masuk ke dalam hasil akhir. Hanya grup untuk departemen 20 yang memenuhi kriteria, dengan gaji maksimum analis di departemen 20 sebesar 3000.00.