メインコンテンツへスキップ
メインコンテンツへスキップ

quantilesGK

quantilesGK

導入バージョン: v23.4

数値データ系列に対して、Greenwald-Khanna アルゴリズムを用いて、複数の異なるレベルの分位点を同時に計算します。

この関数は quantileGK と同様に動作しますが、複数の分位点レベルを単一パスで計算できるため、個々の分位点関数をそれぞれ呼び出すよりも効率的です。

Greenwald-Khanna アルゴリズムは、データストリーム上の分位点を高い効率で計算するために用いられるアルゴリズムです。 このアルゴリズムは 2001 年に Michael Greenwald と Sanjeev Khanna によって提案されました。 このアルゴリズムは非常に効率的であり、要素ごとに O(log n) のメモリ空間と O(log log n) の時間しか必要としません(ここで n は入力サイズです)。 また、高い精度を備えており、制御可能な精度で近似分位点値を提供します。

構文

quantilesGK(accuracy, level1, level2, ...)(expr)

パラメータ

  • accuracy — 分位数の精度を指定します。正の整数の定数値です。値が大きいほど誤差は小さくなります。たとえば、accuracy 引数を 100 に設定した場合、計算された分位数の誤差は高い確率で 1% 以下になります。計算される分位数の精度と、アルゴリズムの計算量との間にはトレードオフがあります。 UInt*
  • level — 分位数のレベルを指定します。0 から 1 の間の 1 つ以上の浮動小数点数の定数です。 Float*

引数

  • expr — 数値データ型、Date、または DateTime を返すカラム値に対する式です。(U)Int* または Float* または Decimal* または Date または DateTime

戻り値

指定されたレベルと同じ順序で、各レベルに対応する分位数の配列を返します。 Array(Float64) または Array(Date) または Array(DateTime)

GK アルゴリズムを用いた複数分位数の計算

SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [1, 1, 1]                                        │
└──────────────────────────────────────────────────┘

より高精度な分位数

SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [251, 498, 741]                                    │
└────────────────────────────────────────────────────┘