グルーピング関数

特別なグルーピングバケット化とも呼ばれる)を作成するための関数。したがって、これらはgroupingの一部として使用する必要があります。

ヒストグラム

概要:

Sql

  1. HISTOGRAM(
  2. numeric_exp,
  3. numeric_interval)
  4. HISTOGRAM(
  5. date_exp,
  6. date_time_interval)

入力:

数値式(通常はフィールド)。このフィールドがnull

の値のみを含む場合、関数はnullを返します。それ以外の場合、関数はこのフィールドのnull

の値を無視します。
数値間隔。nullの場合、関数はnullを返します。
日付/時刻式(通常はフィールド)。このフィールドがnull

の値のみを含む場合、関数はnullを返します。それ以外の場合、関数はこのフィールドのnull

の値を無視します。
日付/時刻間隔nullの場合、関数は

nullを返します。

出力: 指定された間隔に従って分割された与えられた式の非空バケットまたはグループ

説明: ヒストグラム関数は、すべての一致する値を取得し、指定された間隔に一致する固定サイズのバケットに分割します。おおよそ次の式を使用します:

Sql

  1. bucket_key = Math.floor(value / interval) * interval

SQLのヒストグラムは、従来のヒストグラム日付ヒストグラムのように、欠落した間隔のために空のバケットを返しません。このような動作は、すべての欠落値をnullとして扱うSQLの概念に合いません。そのため、ヒストグラムはすべての欠落値をnullグループに配置します。

  1. #### Sql
  2. ``````sql
  3. SELECT HISTOGRAM(salary, 5000) AS h FROM emp GROUP BY h;
  4. h
  5. ---------------
  6. 25000
  7. 30000
  8. 35000
  9. 40000
  10. 45000
  11. 50000
  12. 55000
  13. 60000
  14. 65000
  15. 70000
  16. `

または日付/時刻フィールド:

Sql

  1. SELECT HISTOGRAM(birth_date, INTERVAL 1 YEAR) AS h, COUNT(*) AS c FROM emp GROUP BY h;
  2. h | c
  3. ------------------------+---------------
  4. null |10
  5. 1952-01-01T00:00:00.000Z|8
  6. 1953-01-01T00:00:00.000Z|11
  7. 1954-01-01T00:00:00.000Z|8
  8. 1955-01-01T00:00:00.000Z|4
  9. 1956-01-01T00:00:00.000Z|5
  10. 1957-01-01T00:00:00.000Z|4
  11. 1958-01-01T00:00:00.000Z|7
  12. 1959-01-01T00:00:00.000Z|9
  13. 1960-01-01T00:00:00.000Z|8
  14. 1961-01-01T00:00:00.000Z|8
  15. 1962-01-01T00:00:00.000Z|6
  16. 1963-01-01T00:00:00.000Z|7
  17. 1964-01-01T00:00:00.000Z|4
  18. 1965-01-01T00:00:00.000Z|1

ヒストグラム内の式も、戻り値の型が数値である限りサポートされています:

Sql

  1. SELECT HISTOGRAM(salary % 100, 10) AS h, COUNT(*) AS c FROM emp GROUP BY h;
  2. h | c
  3. ---------------+---------------
  4. 0 |10
  5. 10 |15
  6. 20 |10
  7. 30 |14
  8. 40 |9
  9. 50 |9
  10. 60 |8
  11. 70 |13
  12. 80 |3
  13. 90 |9

ヒストグラム(および一般的なグルーピング関数)はカスタム式を許可しますが、GROUP BY内でそれらに関数を適用することはできません。言い換えれば、次の文は許可されていません:

Sql

  1. SELECT MONTH(HISTOGRAM(birth_date), 2)) AS h, COUNT(*) as c FROM emp GROUP BY h ORDER BY h DESC;

これは、ヒストグラムのための1つのグルーピングと、その上に関数を適用するための2つ目のグルーピングを必要とします。

代わりに、クエリを再構成して、ヒストグラムの内部に式を移動できます:

Sql

  1. SELECT HISTOGRAM(MONTH(birth_date), 2) AS h, COUNT(*) as c FROM emp GROUP BY h ORDER BY h DESC;
  2. h | c
  3. ---------------+---------------
  4. 12 |7
  5. 10 |17
  6. 8 |16
  7. 6 |16
  8. 4 |18
  9. 2 |10
  10. 0 |6
  11. 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' YEARINTERVAL '1' MONTHINTERVAL '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)は現在サポートされていません。