bugfix> postgresql > 投稿

Postgres dbに大きなデータセットがあり、「0-100」、「101-200」、「201-300」などの各ビンに行をグループ化するフィールドを生成する必要があります。 5000.各行を手動で更新し、次のように各ビンのコード行を生成できることを認識しています。

update test
   set testgroup = '0-100' where testint >= 1 and distance < 100;

私は本当にこれを行うためのより効率的な方法を見つけ出したいと思っています。主な目標は、この「testint」列の整数を調べて、1〜100の範囲内にある場合は、テストグループ列「0-100」に戻ります。

回答 2 件
  • width_bucket を使用する  関数。ドキュメントを参照してください。ただし、構文の短いバージョンは次のとおりです。

    width_bucket(a, LBound, UBound, num_bins)
    
    

    ビンに対して適切に機能させるには、UBoundに1を追加する必要があります。いくつかの例:

    select width_bucket( 1, 0, 5001, 50)  与える1
    select width_bucket(100, 0, 5001, 0)  与える1
    select width_bucket(101, 0, 5001, 50)  2を与える
    select width_bucket(4900, 0, 5001, 50)  49を与える
    select width_bucket(4901, 0, 5001, 50)  50を与える

    期待どおりに動作します。次に、適切な文字列を生成する必要があります。擬似フォーマットは

    (width_bucket - 1)*100 || '-' || (width_bucket)*100
    
    

    どこ|| SQL連結演算子です。前の最初の例を使用します。

    select (width_bucket(1, 0, 5001, 50)-1)*100 || ' - ' || width_bucket(1, 0, 5001, 50)*100
    
    

    '0 - 100' を与える

    甘い。それをすべてまとめてみましょう。最初に、テストに使用できるサンドボックステーブルを作成します。これは、データのコピーまたは部分コピーになります。

    CREATE TABLE test
    AS
    SELECT * 
    FROM original_table
    
    

    次に、新しい列をテーブルに追加します。

    ALTER TABLE test
      ADD COLUMN testgroup text
    
    

    次にUPDATEステートメント:

    UPDATE test
       SET testgroup = width_bucket(testint, 0, 5001, 50)-1)*100 || ' - ' || 
                       width_bucket(testint, 0, 5001, 50)*100
    
    

  • generate_series を利用できます  0〜50の数値を生成し、生成された値* 100と次の生成された値* 100の間のデータを選択します。同じ原理がビン名の構築に使用されます。

    UPDATE test
    SET testgroup = (x*100)+1 || '-' || (x+1)*100
    FROM generate_series(0,50) f(x)
    WHERE testint > (x*100) 
      AND testint <= ((x+1)*100);
    
    

    http://rextester.com/FXIS37706

あなたの答え