グルーピング関数
特別なグルーピング(バケット化とも呼ばれる)を作成するための関数。したがって、これらはgroupingの一部として使用する必要があります。
ヒストグラム
概要:
Sql
HISTOGRAM(
numeric_exp,
numeric_interval)
HISTOGRAM(
date_exp,
date_time_interval)
入力:
数値式(通常はフィールド)。このフィールドがnull の値のみを含む場合、関数は null を返します。それ以外の場合、関数はこのフィールドのnull の値を無視します。 |
|
数値間隔。null の場合、関数はnull を返します。 |
|
日付/時刻式(通常はフィールド)。このフィールドがnull の値のみを含む場合、関数は null を返します。それ以外の場合、関数はこのフィールドのnull の値を無視します。 |
|
日付/時刻間隔。null の場合、関数はnull を返します。 |
出力: 指定された間隔に従って分割された与えられた式の非空バケットまたはグループ
説明: ヒストグラム関数は、すべての一致する値を取得し、指定された間隔に一致する固定サイズのバケットに分割します。おおよそ次の式を使用します:
Sql
bucket_key = Math.floor(value / interval) * interval
SQLのヒストグラムは、従来のヒストグラムや日付ヒストグラムのように、欠落した間隔のために空のバケットを返しません。このような動作は、すべての欠落値をnull
として扱うSQLの概念に合いません。そのため、ヒストグラムはすべての欠落値をnull
グループに配置します。
#### Sql
``````sql
SELECT HISTOGRAM(salary, 5000) AS h FROM emp GROUP BY h;
h
---------------
25000
30000
35000
40000
45000
50000
55000
60000
65000
70000
`
または日付/時刻フィールド:
Sql
SELECT HISTOGRAM(birth_date, INTERVAL 1 YEAR) AS h, COUNT(*) AS c FROM emp GROUP BY h;
h | c
------------------------+---------------
null |10
1952-01-01T00:00:00.000Z|8
1953-01-01T00:00:00.000Z|11
1954-01-01T00:00:00.000Z|8
1955-01-01T00:00:00.000Z|4
1956-01-01T00:00:00.000Z|5
1957-01-01T00:00:00.000Z|4
1958-01-01T00:00:00.000Z|7
1959-01-01T00:00:00.000Z|9
1960-01-01T00:00:00.000Z|8
1961-01-01T00:00:00.000Z|8
1962-01-01T00:00:00.000Z|6
1963-01-01T00:00:00.000Z|7
1964-01-01T00:00:00.000Z|4
1965-01-01T00:00:00.000Z|1
ヒストグラム内の式も、戻り値の型が数値である限りサポートされています:
Sql
SELECT HISTOGRAM(salary % 100, 10) AS h, COUNT(*) AS c FROM emp GROUP BY h;
h | c
---------------+---------------
0 |10
10 |15
20 |10
30 |14
40 |9
50 |9
60 |8
70 |13
80 |3
90 |9
ヒストグラム(および一般的なグルーピング関数)はカスタム式を許可しますが、GROUP BY
内でそれらに関数を適用することはできません。言い換えれば、次の文は許可されていません:
Sql
SELECT MONTH(HISTOGRAM(birth_date), 2)) AS h, COUNT(*) as c FROM emp GROUP BY h ORDER BY h DESC;
これは、ヒストグラムのための1つのグルーピングと、その上に関数を適用するための2つ目のグルーピングを必要とします。
代わりに、クエリを再構成して、ヒストグラムの内部に式を移動できます:
Sql
SELECT HISTOGRAM(MONTH(birth_date), 2) AS h, COUNT(*) as c FROM emp GROUP BY h ORDER BY h DESC;
h | c
---------------+---------------
12 |7
10 |17
8 |16
6 |16
4 |18
2 |10
0 |6
null |10
SQLのヒストグラムがDATE型に適用される場合、指定された間隔は日数の倍数に切り捨てられます。例えば、HISTOGRAM(CAST(birth_date AS DATE), INTERVAL '2 3:04' DAY TO MINUTE)
の場合、実際に使用される間隔はINTERVAL '2' DAY
です。指定された間隔が1日未満の場合、例えばHISTOGRAM(CAST(birth_date AS DATE), INTERVAL '20' HOUR)
の場合、使用される間隔はINTERVAL '1' DAY
です。
日付/時刻ヒストグラムに指定されたすべての間隔は、date_histogram
集約定義で固定間隔を使用しますが、INTERVAL '1' YEAR
、INTERVAL '1' MONTH
、INTERVAL '1' DAY
の例外としてカレンダー間隔が使用されます。カレンダー間隔の選択は、YEAR、MONTH、DAYのグルーピングに対してより直感的な結果を得るために行われました。例えば、YEARの場合、カレンダー間隔は特定の年の1月1日から始まる1年のバケットを考慮しますが、固定間隔の1年のバケットは1年をミリ秒の数として考えます(例えば、31536000000ms
は365日、1日24時間、1時間60分などに相当します)。固定間隔の場合、2019年2月5日は2018年12月20日から始まるバケットに属し、Elasticsearch(および暗黙的にElasticsearch SQL)は実際には2019年の日付に対して2018年を返します。カレンダー間隔では、この動作はより直感的であり、2019年2月5日は実際に2019年のバケットに属します。
SQLのヒストグラムはTIME型に適用できません。例えば、HISTOGRAM(CAST(birth_date AS TIME), INTERVAL '10' MINUTES)
は現在サポートされていません。