ClickHouse/docs/ja/sql-reference/aggregate-functions/index.md
2024-11-18 11:58:58 +09:00

136 lines
5.1 KiB
Markdown

---
slug: /ja/sql-reference/aggregate-functions/
sidebar_label: 集約関数
sidebar_position: 33
---
# 集約関数
集約関数は、データベースの専門家が期待する[通常](http://www.sql-tutorial.com/sql-aggregate-functions-sql-tutorial)の方法で動作します。
ClickHouseは以下もサポートしています:
- カラムに加えて他のパラメータを受け入れる[パラメトリック集約関数](../../sql-reference/aggregate-functions/parametric-functions.md#aggregate_functions_parametric)。
- 集約関数の動作を変える[コンビネータ](../../sql-reference/aggregate-functions/combinators.md#aggregate_functions_combinators)。
## NULL の処理
集約中に、すべての `NULL` 引数はスキップされます。集約に複数の引数がある場合、いずれかが `NULL` の行は無視されます。
この規則には例外があり、それが[`first_value`](../../sql-reference/aggregate-functions/reference/first_value.md)、[`last_value`](../../sql-reference/aggregate-functions/reference/last_value.md)およびそのエイリアス(それぞれ `any``anyLast`)で、修飾子 `RESPECT NULLS` が続く場合です。例として、`FIRST_VALUE(b) RESPECT NULLS` があります。
**例:**
次のテーブルを考えてみましょう:
``` text
┌─x─┬────y─┐
│ 1 │ 2 │
│ 2 │ ᴺᵁᴸᴸ │
│ 3 │ 2 │
│ 3 │ 3 │
│ 3 │ ᴺᵁᴸᴸ │
└───┴──────┘
```
`y` カラムの値を合計する必要があるとしましょう:
``` sql
SELECT sum(y) FROM t_null_big
```
```text
┌─sum(y)─┐
│ 7 │
└────────┘
```
次に、`y` カラムから配列を作成するために `groupArray` 関数を使用できます:
``` sql
SELECT groupArray(y) FROM t_null_big
```
``` text
┌─groupArray(y)─┐
│ [2,2,3] │
└───────────────┘
```
`groupArray` は結果の配列に `NULL` を含めません。
[COALESCE](../../sql-reference/functions/functions-for-nulls.md#coalesce) を使用して `NULL` をユースケースに合った値に変更できます。例として、`avg(COALESCE(column, 0))` を使用すると、カラムの値が集約に使われ、`NULL` の場合はゼロが使われます:
``` sql
SELECT
avg(y),
avg(coalesce(y, 0))
FROM t_null_big
```
``` text
┌─────────────avg(y)─┬─avg(coalesce(y, 0))─┐
│ 2.3333333333333335 │ 1.4 │
└────────────────────┴─────────────────────┘
```
また、`Tuple` を使用して `NULL` スキップ動作を回避することもできます。`NULL` 値のみを含む `Tuple``NULL` ではないため、その`NULL` 値のために行がスキップされません。
```sql
SELECT
groupArray(y),
groupArray(tuple(y)).1
FROM t_null_big;
┌─groupArray(y)─┬─tupleElement(groupArray(tuple(y)), 1)─┐
[2,2,3] [2,NULL,2,3,NULL]
└───────────────┴───────────────────────────────────────┘
```
列が集約関数の引数として使用される場合、集約はスキップされます。例えば、パラメータなしの `count()` や定数のもの (`count(1)`) はブロック内のすべての行をカウントします(これは `GROUP BY` カラムの値に依存しないため、引数ではない)が、`count(column)` は列が `NULL` でない行の数のみを返します。
```sql
SELECT
v,
count(1),
count(v)
FROM
(
SELECT if(number < 10, NULL, number % 3) AS v
FROM numbers(15)
)
GROUP BY v
┌────v─┬─count()─┬─count(v)─┐
ᴺᵁᴸᴸ 10 0
0 1 1
1 2 2
2 2 2
└──────┴─────────┴──────────┘
```
`RESPECT NULLS` を伴う `first_value` の例として、`NULL` 入力が尊重され、`NULL` かどうかにかかわらず最初に読み取られた値が返されることを確認できます:
```sql
SELECT
col || '_' || ((col + 1) * 5 - 1) as range,
first_value(odd_or_null) as first,
first_value(odd_or_null) IGNORE NULLS as first_ignore_null,
first_value(odd_or_null) RESPECT NULLS as first_respect_nulls
FROM
(
SELECT
intDiv(number, 5) AS col,
if(number % 2 == 0, NULL, number) as odd_or_null
FROM numbers(15)
)
GROUP BY col
ORDER BY col
┌─range─┬─first─┬─first_ignore_null─┬─first_respect_nulls─┐
0_4 1 1 ᴺᵁᴸᴸ
1_9 5 5 5
2_14 11 11 ᴺᵁᴸᴸ
└───────┴───────┴───────────────────┴─────────────────────┘
```