集計関数は、複数の入力レコードをグループ化して単一の出力レコードを形成します。GROUP BY 句と一緒に集計関数を使用できます。このトピックでは、開発を容易にするために、SQL分析でサポートされている集計関数の構文、パラメーター、および例について説明します。
次の表に、SQL分析でサポートされている集計関数を示します。
関数 | 説明 |
特定の列からランダムな値を返します。 | |
特定の列にある、重複を除いた入力値のおおよその数を返します。 | |
特定の列の最大値に対応する行の列値を返します。 | |
特定の列の最小値に対応する行の列値を返します。 | |
列の平均値を返します。 | |
ビット単位の AND 演算に基づいて入力値を集計します。 | |
ビット単位の OR 演算に基づいて入力値を集計します。 | |
指定された条件に一致するレコードの数を返します。 | |
式の値が True であるレコードの数を返します。 | |
列の最大値を返します。 | |
特定の列の最大値に対応する行の列値を返します。 | |
列の中央値を返します。 | |
列の最小値を返します。 | |
特定の列の最小値に対応する行の列値を返します。 | |
すべての入力値の母集団標準偏差を返します。 | |
すべての入力値の標本標準偏差を返します。 | |
列の合計を返します。 | |
特定のデリミタを使用して文字列を連結します。 |
ANY_VALUE
構文
any_value(<colname>)説明
特定の列からランダムな値を返します。
パラメーター
colname: 必須。任意のデータ型の列の名前。
戻り値
戻り値のデータ型は、colname パラメーターのデータ型と同じです。colname パラメーターの値が null の場合、この値を含む行は計算に使用されません。
例
例 1:従業員の 1 人を選択します。サンプルステートメント:
select any_value(ename) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | SMITH | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、deptno 列に基づいてすべての従業員をグループ化し、各グループから 1 人の従業員を選択します。サンプルステートメント:select deptno, any_value(ename) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | CLARK | | 20 | SMITH | | 30 | ALLEN | +------------+------------+
APPROX_DISTINCT
構文
approx_distinct(<colname>)説明
特定の列にある、重複を除いた入力値のおおよその数を返します。
パラメーター
colname: 必須。重複を削除する必要がある列の名前。
戻り値
BIGINT 型の値が返されます。この関数は、5% の標準偏差を生成します。colname パラメーターで指定された列の値が null の場合、この値を含む行は計算に使用されません。
例
例 1: sal 列にある、重複を除いた値のおおよその数を計算します。サンプルステートメント:
select approx_distinct(sal) from emp;次の出力が返されます:
+-------------------+ | numdistinctvalues | +-------------------+ | 12 | +-------------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、sal 列にある、重複を除いた値のおおよその数を計算します。サンプルステートメント:select deptno, approx_distinct(sal) from emp group by deptno;次の出力が返されます:
+------------+-------------------+ | deptno | numdistinctvalues | +------------+-------------------+ | 10 | 3 | | 20 | 4 | | 30 | 5 | +------------+-------------------+
ARG_MAX
構文
arg_max(<valueToMaximize>, <valueToReturn>)説明
valueToMaximize の最大値が含まれる行を検索し、その行の valueToReturn の値を返します。
パラメーター
valueToMaximize: 必須。任意のデータ型の値。
valueToReturn: 必須。任意のデータ型の値。
戻り値
戻り値のデータ型は、valueToReturn パラメーターのデータ型と同じです。複数の行に valueToMaximize の最大値が含まれている場合、行のいずれかの valueToReturn の値がランダムに返されます。valueToMaximize の値が null の場合、この値を含む行は計算に使用されません。
例
例 1:最も高い給与を得ている従業員の名前を返します。サンプルステートメント:
select arg_max(sal, ename) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | KING | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各グループで最も高い給与を得ている従業員の名前を返します。サンプルステートメント:select deptno, arg_max(sal, ename) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | KING | | 20 | SCOTT | | 30 | BLAKE | +------------+------------+
ARG_MIN
構文
arg_min(<valueToMinimize>, <valueToReturn>)説明
valueToMinimize の値が含まれる行を検索し、その行の valueToReturn の値を返します。
パラメーター
valueToMinimize: 必須。任意のデータ型の値。
valueToReturn: 必須。任意のデータ型の値。
戻り値
戻り値のデータ型は、valueToReturn パラメーターのデータ型と同じです。複数の行に valueToMinimize の最小値が含まれている場合、行のいずれかの valueToReturn の値がランダムに返されます。valueToMinimize の値が null の場合、その値を含む行は計算に使用されません。
例
例 1:最も低い給与を得ている従業員の名前を返します。サンプルステートメント:
select arg_min(sal, ename) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | SMITH | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各グループで最も低い給与を得ている従業員の名前を返します。サンプルステートメント:select deptno, arg_min(sal, ename) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | MILLER | | 20 | SMITH | | 30 | JAMES | +------------+------------+
AVG
構文
DECIMAL|DOUBLE avg(<colname>)説明
列の平均値を返します。
パラメーター
colname: 必須。列値はすべてのデータ型をサポートし、計算前に DOUBLE 型に変換できます。
戻り値
colname の値が null の場合、この値を含む行は計算に使用されません。次の表に、入力データのデータ型と戻り値のマッピングを示します。
入力データのデータ型
戻り値のデータ型
TINYINT
DOUBLE
SMALLINT
DOUBLE
INT
DOUBLE
BIGINT
DOUBLE
FLOAT
DOUBLE
DOUBLE
DOUBLE
DECIMAL
DECIMAL
例
例 1:すべての従業員の平均給与 (sal) 値を計算します。サンプルステートメント:
select avg(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 2222.0588235294117 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の平均給与 (sal) 値を計算します。サンプルステートメント:select deptno, avg(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 2916.6666666666665 | | 20 | 2175.0 | | 30 | 1566.6666666666667 | +------------+------------+
BITWISE_AND_AGG
構文
bigint bitwise_and_agg(bigint value)説明
ビット単位の AND 演算に基づいて入力値を集計します。
パラメーター
value: 必須。BIGINT 型の値。NULL 値は計算に使用されません。
戻り値
BIGINT 型の値が返されます。
例
select id, bitwise_and_agg(v) from values (1L, 2L), (1L, 1L), (2L, null), (1L, null) t(id, v) group by id;次の出力が返されます:
+------------+------------+ | id | _c1 | +------------+------------+ | 1 | 0 | | 2 |NULL | +------------+------------+
BITWISE_OR_AGG
構文
bigint bitwise_or_agg(bigint value)説明
ビット単位の OR 演算に基づいて入力値を集計します。
パラメーター
value: 必須。BIGINT 型の値。NULL 値は計算に使用されません。
戻り値
BIGINT 型の値が返されます。
例
select id, bitwise_or_agg(v) from values (1L, 2L), (1L, 1L), (2L, null), (1L, null) t(id, v) group by id;次の出力が返されます:
+------------+------------+ | id | _c1 | +------------+------------+ | 1 | 3 | | 2 | NULL | +------------+------------+
COUNT
構文
bigint count([distinct|all] <colname>)説明
指定された条件に一致するレコードの数を返します。
パラメーター
distinct|all: オプション。このパラメーターは、カウント中に重複を削除するかどうかを指定します。デフォルト値は all で、すべてのレコードがカウントされることを指定します。このパラメーターを distinct に設定すると、値が重複していないレコードのみがカウントされます。
colname: 必須。任意のデータ型の列の名前。colname の値はアスタリスク (
*) にすることができます。count(*)は、すべての行の数が返されることを示します。
戻り値
BIGINT 型の値が返されます。colname で指定された列の値が null の場合、この値を含む行は計算に使用されません。
例
例 1:すべての部門の従業員の総数を計算します。サンプルステートメント:
select count(*) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 17 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員数を計算します。サンプルステートメント:select deptno, count(*) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 6 | | 20 | 5 | | 30 | 6 | +------------+------------+例 3:部門数を計算するときに重複を削除します。 サンプルステートメント:
select count(distinct deptno) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 3 | +------------+
COUNT_IF
構文
bigint count_if(boolean <expr>)説明
expr の値が True であるレコードの数を返します。
パラメーター
expr: 必須。ブール式。
戻り値
BIGINT 型の値が返されます。expr パラメーターの値が False であるか、expr 内の特定の列の値が null の場合、この値を含む行は計算に使用されません。
例
select count_if(sal > 1000), count_if(sal <=1000) from emp;次の出力が返されます:
+------------+------------+ | _c0 | _c1 | +------------+------------+ | 15 | 2 | +------------+------------+
MAX
構文
max(<colname>)説明
列の最大値を返します。
パラメーター
colname: 必須。BOOLEAN 以外の任意のデータ型の列の名前。
戻り値
戻り値の型は、colname パラメーターの型と同じです。戻り値は、次のルールに基づいて異なります。
colname の値が null の場合、この値を含む行は計算に使用されません。
colname の値が BOOLEAN 型の場合、その値は計算に使用されません。
例
例 1:すべての従業員の中で最も高い給与 (sal) を計算します。サンプルステートメント:
select max(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 5000 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の中で最も高い給与を計算します。サンプルステートメント:select deptno, max(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 5000 | | 20 | 3000 | | 30 | 2850 | +------------+------------+
MAX_BY
構文
max_by(<valueToReturn>,<valueToMaximize>)説明
説明MAX_BY 関数は ARG_MAX 関数と同じ機能を提供します。ただし、関数はパラメーターの順序が異なります。MAX_BY 関数は、オープンソース構文との互換性を維持するために MaxCompute に導入されています。
valueToMaximize の最大値が含まれる行を検索し、その行の valueToReturn の値を返します。
パラメーター
valueToMaximize: 必須。任意のデータ型の値。
valueToReturn: 必須。任意のデータ型の値。
戻り値
戻り値のデータ型は、valueToReturn パラメーターのデータ型と同じです。複数の行に valueToMaximize の最大値が含まれている場合、行のいずれかの valueToReturn の値がランダムに返されます。valueToMaximize の値が null の場合、この値を含む行は計算に使用されません。
例
例 1:最も高い給与を得ている従業員の名前を返します。サンプルステートメント:
select max_by(ename,sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | KING | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、deptno 列に基づいてすべての従業員をグループ化し、各グループで最も高い給与を得ている従業員の名前を返します。サンプルステートメント:select deptno, max_by(ename,sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | KING | | 20 | SCOTT | | 30 | BLAKE | +------------+------------+
MEDIAN
構文
double median(double <colname>) decimal median(decimal <colname>)説明
列の中央値を返します。
パラメーター
colname: 必須。DOUBLE 型または DECIMAL 型の列の名前。入力値が STRING 型または BIGINT 型の場合、計算前に暗黙的に DOUBLE 型に変換されます。
戻り値
colname の値が null の場合、この値を含む行は計算に使用されません。次の表に、入力データのデータ型と戻り値のマッピングを示します。
入力データのデータ型
戻り値のデータ型
TINYINT
DOUBLE
SMALLINT
DOUBLE
INT
DOUBLE
BIGINT
DOUBLE
FLOAT
DOUBLE
DOUBLE
DOUBLE
DECIMAL
DECIMAL
例
例 1:すべての従業員の中央給与 (sal) 値を計算します。サンプルステートメント:
select median(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 1600.0 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の中央給与値を計算します。サンプルステートメント:select deptno, median(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 2450.0 | | 20 | 2975.0 | | 30 | 1375.0 | +------------+------------+
MIN
構文
min(<colname>)説明
列の最小値を返します。
パラメーター
colname: 必須。BOOLEAN 以外の任意のデータ型の列の名前。
戻り値
戻り値の型は、colname パラメーターの型と同じです。戻り値は、次のルールに基づいて異なります。
colname の値が null の場合、この値を含む行は計算に使用されません。
colname の値が BOOLEAN 型の場合、その値は計算に使用されません。
例
例 1:すべての従業員の中で最も低い給与 (sal) を計算します。サンプルステートメント:
select min(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 800 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の中で最も低い給与を計算します。サンプルステートメント:select deptno, min(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 1300 | | 20 | 800 | | 30 | 950 | +------------+------------+
MIN_BY
構文
min_by(<valueToReturn>,<valueToMinimize>)説明
説明MIN_BY 関数は ARG_MIN 関数と同じ機能を提供します。ただし、関数はパラメーターの順序が異なります。MIN_BY 関数は、オープンソース構文との互換性を維持するために MaxCompute に導入されています。
valueToMinimize の最小値が含まれる行を検索し、その行の valueToReturn の値を返します。
パラメーター
valueToMinimize: 必須。任意のデータ型の値。
valueToReturn: 必須。任意のデータ型の値。
戻り値
戻り値のデータ型は、valueToReturn パラメーターのデータ型と同じです。複数の行に valueToMinimize の最小値が含まれている場合、行のいずれかの valueToReturn の値がランダムに返されます。valueToMinimize の値が null の場合、この値を含む行は計算に使用されません。
例
例 1:最も低い給与を得ている従業員の名前を返します。サンプルステートメント:
select min_by(ename,sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | SMITH | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各グループで最も低い給与を得ている従業員の名前を返します。サンプルステートメント:select deptno, min_by(ename,sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | MILLER | | 20 | SMITH | | 30 | JAMES | +------------+------------+
STDDEV
構文
double stddev(double <colname>) decimal stddev(decimal <colname>)説明
すべての入力値の母集団標準偏差を返します。
パラメーター
colname: 必須。DOUBLE 型または DECIMAL 型の列の名前。入力値が STRING 型または BIGINT 型の場合、計算前に暗黙的に DOUBLE 型に変換されます。
戻り値
colname の値が null の場合、この値を含む行は計算に使用されません。次の表に、入力データのデータ型と戻り値のマッピングを示します。
入力データのデータ型
戻り値のデータ型
TINYINT
DOUBLE
SMALLINT
DOUBLE
INT
DOUBLE
BIGINT
DOUBLE
FLOAT
DOUBLE
DOUBLE
DOUBLE
DECIMAL
DECIMAL
例
例 1:すべての従業員の給与 (sal) 値の母集団標準偏差を計算します。サンプルステートメント:
select stddev(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 1262.7549932628976 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の給与値 (sal) の母集団標準偏差を計算します。サンプルステートメント:select deptno, stddev(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 1546.1421524412158 | | 20 | 1004.7387720198718 | | 30 | 610.1001739241043 | +------------+------------+
STDDEV_SAMP
構文
double stddev_samp(double <colname>) decimal stddev_samp(decimal <colname>)説明
すべての入力値の標本標準偏差を返します。
パラメーター
colname: 必須。DOUBLE 型または DECIMAL 型の列の名前。入力値が STRING 型または BIGINT 型の場合、計算前に暗黙的に DOUBLE 型に変換されます。
戻り値
colname の値が null の場合、この値を含む行は計算に使用されません。次の表に、入力データのデータ型と戻り値のマッピングを示します。
入力データのデータ型
戻り値のデータ型
TINYINT
DOUBLE
SMALLINT
DOUBLE
INT
DOUBLE
BIGINT
DOUBLE
FLOAT
DOUBLE
DOUBLE
DOUBLE
DECIMAL
DECIMAL
例
例 1:すべての従業員の給与 (sal) 値の標本標準偏差を計算します。サンプルステートメント:
select stddev_samp(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 1301.6180541247609 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の給与値の標本標準偏差を計算します。サンプルステートメント:select deptno, stddev_samp(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 1693.7138680032901 | | 20 | 1123.3320969330487 | | 30 | 668.3312551921141 | +------------+------------+
SUM
構文
DECIMAL|DOUBLE|BIGINT sum(<colname>)説明
列の合計を返します。
パラメーター
colname: 必須。列値はすべてのデータ型をサポートし、計算前に DOUBLE 型に変換できます。DOUBLE、DECIMAL、または BIGINT 型の列の名前。入力値が STRING 型の場合、計算前に暗黙的に DOUBLE 型に変換されます。
戻り値
colname の値が null の場合、この値を含む行は計算に使用されません。次の表に、入力データのデータ型と戻り値のマッピングを示します。
入力データのデータ型
戻り値のデータ型
TINYINT
BIGINT
SMALLINT
BIGINT
INT
BIGINT
BIGINT
BIGINT
FLOAT
DOUBLE
DOUBLE
DOUBLE
DECIMAL
DECIMAL
例
例 1:すべての従業員の給与 (sal) 値の合計を計算します。サンプルステートメント:
select sum(sal) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | 37775 | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の給与値の合計を計算します。サンプルステートメント:select deptno, sum(sal) from emp group by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 17500 | | 20 | 10875 | | 30 | 9400 | +------------+------------+
WM_CONCAT
構文
string wm_concat(string <separator>, string <colname>)説明
separator で指定されたデリミタを使用して、colname の値を連結します。
パラメーター
separator: 必須。STRING 型の定数であるデリミタ。
colname: 必須。STRING 型の値。入力値が BIGINT、DOUBLE、または DATETIME 型の場合、計算前に暗黙的に STRING 型に変換されます。
戻り値 (
GROUP BY句が指定され、ORDER BY 句が指定されていません。)STRING 型の値が返されます。戻り値は、次のルールに基づいて異なります。
separator の値が STRING 型の定数でない場合は、エラーが返されます。
colname の値が STRING、BIGINT、DOUBLE、または DATETIME 型でない場合は、エラーが返されます。
colname の値が null の場合、この値を含む行は計算に使用されません。
説明select wm_concat(',', name) from table_name;ステートメントのtable_nameの値が空のセットの場合、null が返されます。例
例 1:すべての従業員の名前 (ename) を連結します。サンプルステートメント:
select wm_concat(',', ename) from emp;次の出力が返されます:
+------------+ | _c0 | +------------+ | SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,JAMES,FORD,MILLER,JACCKA,WELAN,TEBAGE | +------------+例 2:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門の従業員の名前 (ename) を連結します。サンプルステートメント:select deptno, wm_concat(',', ename) from emp group by deptno order by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | CLARK,KING,MILLER,JACCKA,WELAN,TEBAGE | | 20 | SMITH,JONES,SCOTT,ADAMS,FORD | | 30 | ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES | +------------+------------+例 3:
GROUP BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、重複を削除した後に各部門の従業員の給与値を連結します。サンプルステートメント:select deptno, wm_concat(distinct ',', sal) from emp group by deptno order by deptno;次の出力が返されます:
+------------+------------+ | deptno | _c1 | +------------+------------+ | 10 | 1300,2450,5000 | | 20 | 1100,2975,3000,800 | | 30 | 1250,1500,1600,2850,950 | +------------+------------+例 4:
GROUP BY句とORDER BY句と一緒にこの関数を使用して、部門 (deptno) 別にすべての従業員をグループ化し、各部門のすべての従業員の給与値 (sal) を連結し、給与値 (sal) を特定の順序でソートします。サンプルステートメント:select deptno, wm_concat(',',sal) within group(order by sal) from emp group by deptno order by deptno;次の出力が返されます:
+------------+------------+ |deptno|_c1| +------------+------------+ |10|1300,1300,2450,2450,5000,5000| |20|800,1100,2975,3000,3000| |30|950,1250,1250,1500,1600,2850| +------------+------------+