sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでのWidth_Bucket()のしくみ

    PostgreSQLでは、width_bucket() は、等幅ヒストグラムのバケット(個々のセグメント)に値を割り当てる数学関数です。

    戻り値のタイプはintです 。

    構文

    この関数は、次の3つの構文のいずれかで使用できます。

    width_bucket(operand dp, b1 dp, b2 dp, count int)
    width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
    width_bucket(operand anyelement, thresholds anyarray)

    最初の2つは基本的に同じですが、使用するデータ型が異なります(倍精度と数値)。

    これらの3つの構文について以下で説明します。

    width_bucket(operand dp, b1 dp, b2 dp, count int)
    b1からb2の範囲にまたがるカウントが等しい幅のバケットを持つヒストグラムでオペランドが割り当てられるバケット番号を返します。範囲外の入力に対して0またはcount+1を返します。
    width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
    b1からb2の範囲にまたがるカウントが等しい幅のバケットを持つヒストグラムでオペランドが割り当てられるバケット番号を返します。範囲外の入力に対して0またはcount+1を返します。
    width_bucket(operand anyelement, thresholds anyarray)
    バケットの下限をリストする配列を指定して、オペランドが割り当てられるバケット番号を返します。最初の下限よりも小さい入力の場合は0を返します。しきい値配列を並べ替える必要があります。最初に最小にする必要があります。そうしないと、予期しない結果が得られます。

    例–1番目/2番目の構文

    前述のように、最初の2つの構文は、異なるデータ型(倍精度と数値)の概要を示していることを除いて、基本的に同じです。

    これは、最初の2つの構文がどのように機能するかを示す例です。

    SELECT 
      width_bucket(3, 1, 12, 3),
      width_bucket(5, 1, 12, 3),
      width_bucket(9, 1, 12, 3);

    結果:

     width_bucket | width_bucket | width_bucket
    --------------+--------------+--------------
                1 |            2 |            3

    これが説明です。最後の議論から始めて、最初の議論に逆戻りして、各議論を調べてみましょう。

    • 4番目の議論 :バケットを3つ指定します。これを行うには、4番目の引数として3を使用します。
    • 2番目と3番目の引数 :範囲を1〜12に指定します。この場合、2番目の引数は1で、3番目の引数は12です。
    • 最初の議論 :この値は、3つのバケットのどれに割り当てられるべきかを知るために、2番目と3番目の引数と比較されます。私の例では、width_bucket()を呼び出します 概念をよりよく説明するために3回。これは、最初の引数として3つの異なる値を指定できるようにするためです。各値は、異なるバケットに割り当てられます。

    次の表は、これを視覚化する別の方法を示しています。

    バケット
    1、2、3、4 バケット1
    5、6、7、8 バケット2
    9、10、11、12 バケット3

    したがって、最初のバケットは1〜4の値を受け入れ、2番目のバケットは5〜8の値を受け入れ、3番目のバケットは9〜12の値を受け入れることがわかります。

    バケットが4つになるように変更すると、コードは次のようになります。

    SELECT 
      width_bucket(3, 1, 12, 4),
      width_bucket(5, 1, 12, 4),
      width_bucket(9, 1, 12, 4);

    そして、テーブルは次のようになります:

    バケット
    1、2、3 バケット1
    4、5、6 バケット2
    7、8、9 バケット3
    10、11、12 バケット4

    範囲外

    入力がバケットの範囲外の場合は、0または countのいずれかを取得します +1、入力が範囲より下か上かによって異なります。

    例:

    SELECT 
      width_bucket(-3, 1, 12, 3),
      width_bucket(20, 1, 12, 3);

    結果:

     width_bucket | width_bucket
    --------------+--------------
                0 |            4

    例–3番目の構文

    3番目の構文を示すために、上記の最初の例を取り上げて、3番目の構文を使用するように変更してみましょう。

    SELECT 
      width_bucket(3, array[1, 4, 8]),
      width_bucket(5, array[1, 4, 8]),
      width_bucket(9, array[1, 4, 8]);

    結果:

     width_bucket | width_bucket | width_bucket
    --------------+--------------+--------------
                1 |            2 |            3

    ここでは、3つのバケットを作成し、それぞれに明示的な値を割り当てました。この場合、それらはすべて同じ幅のバケットですが、それは必須ではありません。

    3番目の構文の主な利点は、幅が等しくないバケットを作成できることです。

    たとえば、前の例を次のように変更できます。

    SELECT 
      width_bucket(3, array[1, 3, 12]),
      width_bucket(5, array[1, 3, 12]),
      width_bucket(9, array[1, 3, 12]);

    結果:

     width_bucket | width_bucket | width_bucket
    --------------+--------------+--------------
                2 |            2 |            2

    これを行うと、各番号が割り当てられているバケットが変更されます。現在、これらの番号はすべて2番目のバケットに属しています。

    3番目の構文は、さまざまなユースケースに役立つ可能性があります。たとえば、均等に分散されていないさまざまな年齢層が存在する場合があります。

    SELECT 
      width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
      width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
      width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";

    結果:

     Age Group (15) | Age Group (45) | Age Group (50)
    ----------------+----------------+----------------
                  1 |              3 |              4

    範囲外

    入力が最初の下限よりも小さい場合、関数は0を返します。

    例:

    SELECT width_bucket(8, array[10, 40, 30]);

    結果:

    0

    Width_Bucket()とCASE

    このページの例は、CASEを使用して実行することもできます。 声明。違いは、width_bucket() より簡潔な方法でそれを行います。

    CASEを使用して前の例を書き直す方法は次のとおりです。 ステートメント。

    SELECT
      CASE
        WHEN 8 BETWEEN  0 AND 9 THEN 0
        WHEN 8 BETWEEN 10 AND 39 THEN 1
        WHEN 8 BETWEEN 40 AND 49 THEN 2
        ELSE 3
      END;

    結果:

    0

    これらすべての例の入力は、通常、定数ではなく変数または列名であることに注意してください。


    1. SQL Server(T-SQL)でデータベースのリストを取得する3つの方法

    2. データベースをアップグレードするときに楽しむ5つの利点

    3. Fedora33にPostgreSQL12をインストールする方法

    4. SQL ServerでのRANK()の動作