mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-14 18:32:29 +00:00
136 lines
5.1 KiB
Markdown
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 │ ᴺᵁᴸᴸ │
|
||
|
└───────┴───────┴───────────────────┴─────────────────────┘
|
||
|
```
|