他のほとんどのリレーショナルデータベースサービスと同様に、PolarDB for PostgreSQL (Compatible with Oracle) は集計関数をサポートしています。 集計関数は、複数の入力行から単一の結果を計算します。 たとえば、集計を使用して、一連の行の COUNT、SUM、AVG (平均)、MAX (最大)、および MIN (最小) を計算できます。
例
次の例はすべて、サンプルデータベースで説明されているサンプルデータベースに基づいています。
次のステートメントを実行して、最高給与と最低給与を見つけます。
SELECT MAX(sal) highest_salary, MIN(sal) lowest_salary FROM emp;
次の応答が返されます。
highest_salary | lowest_salary ----------------+--------------- 5000 | 800 (1 row)
次のステートメントを実行して、給与が最も高い従業員を見つけます。
SELECT ename FROM emp WHERE sal = MAX(sal);
次の応答が返されます。
ERROR: aggregate functions are not allowed in WHERE
MAX 集計関数は WHERE 句では使用できません。 WHERE 句は、集計できる行を決定します。 句は、集計関数が計算される前に評価される必要があります。 ただし、サブクエリを使用してクエリを再記述し、期待する結果を得ることができます。
SELECT ename FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
次の応答が返されます。
ename ------- KING (1 row)
サブクエリは、外部クエリとは別に独自の結果を取得する独立した計算です。
GROUP BY句を使用します。 たとえば、次のステートメントを実行して、各部門の最高給与を照会します。
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;
次の応答が返されます。
deptno | max --------+--------- 10 | 5000.00 20 | 3000.00 30 | 2850.00 (3 rows)
WHEREおよびHAVING句で使用します。
HAVING句を使用して、これらのグループ化された行をフィルタリングし、部門ごとに1つの出力行を生成します。 各集計結果は、その部門に一致する行に対して計算されます。
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;
次の結果が返されます。 同じ結果は、平均給与が2000を超える部門に対してのみ返されます。
WHERE句を使用して、各部門のアナリストである最高賃金の従業員を照会します。
SELECT deptno, MAX(sal) FROM emp WHERE job = 'ANALYST' GROUP BY deptno HAVING AVG(sal) > 2000;
次の応答が返されます。
deptno | max --------+--------- 20 | 3000.00 (1 row)
WHERE 句とHAVING 句の間には微妙な違いがあります。 グループ化が行われ、集計関数が適用される前に、WHERE 句は行を除外します。 行がグループ化され、グループごとに集計関数が計算された後、HAVING 句は結果にフィルター処理します。
したがって、前の例では、アナリストである従業員のみが考慮されます。 このサブセットから、従業員は部門ごとにグループ化され、グループ内のアナリストの平均給与が 2000 を超えるグループのみが最終結果に含まれます。 部門 20 のグループのみが基準を満たし、部門 20 のアナリストの最大給与は 3000.00 です。